Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.17 KB | None | 0 0
  1. ; https://www.instructables.com/id/Command-Line-Assembly-Language-Programming-for-Ard-1/ Här kan du läsa mer grundlig föklaring till koden.
  2. ; https://www.youtube.com/watch?v=pInCtpDUz98 Här är en video som visar hur man kan simulera en atmega328p i Atmel Studio
  3. ;----Registerdefinitioner
  4. .DEF rTemp = r16
  5.  
  6. ;----Konstanter
  7.  
  8. ;----Datasegment
  9.  
  10. ;----Kodsegment
  11.  
  12. .CSEG
  13. .ORG 0x0000
  14. jmp init
  15.  
  16. init:
  17. ser rTemp ;Sätter alla bitar i rTemp till 1 , rTemp = 0b11111111
  18. out DDRB,rTemp ;DDRX står för data direction register, vilket X kan vara A, B, C eller D beroende på vilken typ av AVR mikrokontroller som används.
  19. ;När man sätter en bit till 1 på Data Direction I/0 registrer för portB, som man kan se här är DDRB, så blir motsvarande pin satt som output
  20. ;skulle man istället sätta en 0 så skulle samma pin bli satt som input.
  21. ;Eftersom att vi satt alla bitar i rTemp 1 så kommer alla PortB pins att bli satta som output.
  22.  
  23. ldi rTemp,0b11111110;Här laddar vi in ett nytt värde i rTemp, eftersom vi laddar en konstant så använder vi load immediate
  24. ;Om det hade varit en minnesplats vi ladda ifrån så skulle vi kunnat använt ld istället
  25.  
  26. out DDRD,rTemp ;Nu sätter vi istället DDRD till värdena som just lagrades i rTemp.
  27. ;Lägg märke till att denna gången är det portD vi jobbar med.
  28. ;Eftersom alla bittar är satta till 1 förutom sista biten så betyder det att PD0 är en input, medans resterande av högre värde bit plats är outputs.
  29. ;Om du tar en titt på Atmega328p pin mappningen så kmr du se PD går från 0-7, som en byte.
  30.  
  31.  
  32. clr rTemp ;Här sätter vi alla bitar i rTemp till 0, clr står för clear register.
  33. out PortB,rTemp ;Sätter portB till värdet i rTemp, d.v.s. alla bitar till 0, alla pins blir satta till noll för PortB.
  34. ldi rTemp,0b00000001 ;Laddar rTemp med ett nytt värde, alla bitar förutom sista satta till 0
  35. out PortD,rTemp ;Sätter PortD till rTemp, eftersom alla är bitar är nollor förutom sista så blir PD0 aktiv medans resterande kvarstår som avstängda
  36. ;Lägg märkte till att PD0 ÄR AKTIV INPUT.
  37.  
  38. ; Main body of program:
  39. Main:
  40. in rTemp,PinD ;PinD håller status av PortD, vi kopierar denna statusen till temp,
  41. ;Om en knappen är ansluten till PD0 och blir klickad så ändras statusen på den den aktiva input biten till 1 från 0
  42. ;Om den är aktiv så blir rTemp satt till 0b00000001
  43.  
  44. out PortB,rTemp ;Här laddar vi PortB med värdet från rTemp som fick sitt värde från input,
  45. ;Vad som händer nu är att ifall någon hade klickat på knappen innan så borde 0b00000001 nu blivi satt på PortB
  46. ;Detta skulle gjort så att PB0, den sista biten i PortB blev aktiv, om detta vore en led som var ikopplad på PB0, så skulle den nu blivit aktiv.
  47.  
  48. rjmp Main ;Här loppar vi tillbaka till main, på det viset kollas hela tiden om något har aktiverat inputen på PD0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement