Mein Programm ist ein Anfängerprogramm, ich will neben c auch noch assambler lernen, aber ich habe da startschwierigkeiten. kann mir jemand den/die Fehler nennen die ich mache? .include "m162def.inc" .org 0x022 rjmp leuchte .dseg schritt: .byte 1 seconds: .byte 1 parts: .byte 1 .def save_sreg = r0 .def iwr0 = r18 .def iwr1 = r19 .def temp = r6 .def wr0 = r17 .def Leuchter = r16 .cseg init: ldi wr0, 0xFF out DDRB, wr0 ldi wr0, 0x00 out PORTB, wr0 ldi wr0, 0xFF out PORTD, wr0 ldi wr0, 1<<CS02 | 1<<CS00 out TCCR0, wr0 ldi wr0, 1<<TOIE0 ;enable timer interrupt out TIMSK, wr0 ldi Leuchter, 0x00 out PORTB, Leuchter ldi iwr0, 0x00 ldi iwr1, 0x00 sei main: rjmp main leuchte: inc iwr0 cpi iwr0, 4 breq rollen reti rollen: ldi iwr0, 0 in Leuchter, PORTB inc Leuchter out PORTB, Leuchter reti ps. Ja ich habe im Simulator gedebuggt... und das "AVR Simulator: Uninitialized stack pointer used at 0x000f" Spuckt er bei jedem OVF aus... Vielen Dank für Eure hilfe
Hallo, ist das das komplette Programm? Du startest mit .org 0x0022 rjmp leuchte Der AVR startet nach Reset an Adresse 0. Ich vermisste den rjmp init (oder wohin auch immer) an Adresse 0. Die fehlende Stack-Initialisierung wurde ja schon agesprochen. Günstiger (weniger für das Programm als für die Leser hier ;)) ist es außerdem, mehr Symbole zu benutzen. Statt .org 0x0022 den Namen der IRQ-Adresse, zu finden in der m162def.inc Also so z.B. rjmp init ; Auf Adresse 0 -> Sprung zum Start bei Reset .org OVF0addr rjmp leuchte Vorteilhaft ist es dann auch, den Vektor-Bereich komplett auszusparen (wenn man die paar Bytes Flash nicht dringend braucht) und mit .cseg .org INT_VECTORS_SIZE ; erste Adresse nach den IRQ-Vektoren -> m162def.inc Init: ldi wr0, 0xFF usw. usw. weiterzumachen. Gruß aus Berlin Michael
Ach Mist, genau den Fehler habe ich heute in der Schule gemacht und mich gewundert, warum's nicht läuft.
Hi @Markus und die anderen Assemblerbeginner Gewöhnt euch einfach mal an ,die Interruptsprungtabelle wie im Datenblatt zu machen (bei etlichen PDFs kann man die sogar rauskopieren). Das Programm wird dadurch wesentlich übersichtlicher und man vermeidet etlichen Anfängerstress. Mit den '.org xxx' spart man prinzipiell keinen Speicherplatz (bestenfalls etwas Schreibarbeit). Zur Not kann man die nicht benutzten Interruptvektoren auf ein gemeinsames Ziel umleiten. Beispiel rjmp RESET rjmp EXT_INT0 rjmp dummy ;PC_INT0 rjmp dummy ;TIM0_OVF rjmp dummy ;EE_RDY ... RESET: Stackinitialisierung ... dummy: reti EXT_INT0: Interruptroutine reti ;PC_INT0: reti ;TIM0_OVF: reti ;EE_RDY: reti ... Bei einen neuen Interrupt brauchen nur die Auskommentierungen entfernt werden. MfG Spess
ja ne, is klar. aber wie mach ich das jetzt, dass die leds bei 0x00 aus sind und bei 0xFF an sind?
> aber wie mach ich das jetzt, dass die leds bei 0x00 aus sind und bei > 0xFF an sind? - 'elektrische' Lösung: anders anschließen - software Lösung: den einschalt wert vor dem 'out' umdrehen -- mit 'com' wahrscheinlich (mit ~ in C)
wie gesagt, ich benutze das stk500, da muss es doch bestimmt nur eine änderung im code geben, oder?
Auf dem stk-500 sind die LEDs zwischen den µC-Pin und Vcc angeschlossen, wahrscheinlich, weil: - die alten AVRs (at90s...) nicht genug Strom für LEDs liefern, aber 'sinken' , also quasi 'ableiten' können - das Board verschiedene Spannungen für die µCs unterstützt, und so die LEDs immer gleich hell leuchten. also: Die LEDs gehen an, wenn man 0 augibt, gewöhn dich dran, ist doch nicht so tragisch ;) hth. Jörg
Hi Worin liegt das Problem. Einzelne Leds Schalten: 'cbi PortB,0' statt 'sbi PortB,0 Ganzes Byte ausgeben: com r16 Out PortB,r16 Indeinem Programm: ldi r16,$FF out PortB,r16 ; alle Leds aus etwas später: in r16,PortB dec r16 out PortB,r16 übrigens ergibt das kein 'rollen' sondern eine binär Darstellung von 0..255 MfG Spess
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.