Hallo Leute, Vielleicht übersehe ich hier etwas bei dem unten stehenden Programmcode.Der Timer0 von Atmega8 soll an PortB ein Rechtecksignal erzeugen. ich habe das programm mit avrstudio in den controller übertragen und an portB ein oscilloscope angeschlossen. das Rechecksignal erscheint für eine sehr kurze zeit auf dem schrimm aber dann geht es wieder auf low. was meint Ihr, was ich als Anfenger hier die ganze zeit übersehe und nicht darauf kommen kann? wäre dankbar für den Tipp. kaveh interne Takt 1MHz. Board von myavr .include"m8def.inc" .ORG OVF0addr rjmp Timer_0 main: ldi r16,0xff out ddrb,r16 ;------------------- ldi r16,0b00000011 out TCCR0,r16 ldi r16,0b00000001 out TIMSK,r16 ldi r16,0 sei ;--------------------- mainloop: rjmp mainloop Timer_0: com r16 out portb,r16 reti
Hallo, das habe ich auch gerade gemacht( Siehe unten), aber es hat sich nicht geändert. es ist so, wenn ich das code jedesmal übertrage, dann erscheint das Signal und dann verschwindet. bin ziemlich ratlos. .include"m8def.inc" .ORG OVF0addr rjmp Timer_0 main: ldi r16,high(ramend) out sph,r16 ldi r16,low(ramend) out spl,r16 ;---------------------- ldi r16,0xff out ddrb,r16 ;------------------- ldi r16,0b00000101 out TCCR0,r16 ldi r16,0b00000001 out TIMSK,r16 ldi r16,0 sei ;--------------------- mainloop: rjmp mainloop Timer_0: com r16 out portb,r16 reti
Watchdog-Fuse noch an? AVR Fuses kontrollieren und ggf. zeigen Spannungsversorgung instabil und daher AVR instabil und RESET gefährdet? Schaltplan und/oder Aufbau zeigen, was am Port B Strom zieht. Statt kompletten Port B zu toggeln mal auf einen Pin konzentrieren.
Hi Kein 'rjmp main' auf Adresse $0000. Kein Stackpointer initialisiert. MfG Spess
Hallo, Nun habe ich das Code etwas geändet(diesmal mit Grundgrüst) und sehe, dass es jetzt funktioniert aber erklären kann ich mir immer noch nicht ganz genau. kann sein?, dass die ORG OVF0addr bei dem Anfangscode das Problemm war? oder woran kann es liegen. die Stromversorgung ist in ordnung. danke Kaveh ;+---------------------------------------------------------------------- ;| Title : myAVR Grundgerüst für ATmega8 ;+---------------------------------------------------------------------- ;| Funktion : ... ;| Schaltung : ... ;+---------------------------------------------------------------------- ;| Prozessor : ATmega8 ;| Takt : 3,6864 MHz ;| Sprache : Assembler ;| Datum : ... ;| Version : ... ;| Autor : ... ;+---------------------------------------------------------------------- .include "m8def.inc" ;----------------------------------------------------------------------- - ;Reset and Interrupt vector ;VNr. Beschreibung rjmp main ;1 POWER ON RESET reti ;2 Int0-Interrupt reti ;3 Int1-Interrupt reti ;4 TC2 Compare Match reti ;5 TC2 Overflow reti ;6 TC1 Capture reti ;7 TC1 Compare Match A reti ;8 TC1 Compare Match B reti ;9 TC1 Overflow rjmp Timer_0 ;10 TC0 Overflow reti ;11 SPI, STC Serial Transfer Complete reti ;12 UART Rx Complete reti ;13 UART Data Register Empty reti ;14 UART Tx Complete reti ;15 ADC Conversion Complete reti ;16 EEPROM Ready reti ;17 Analog Comparator reti ;18 TWI (I²C) Serial Interface reti ;19 Store Program Memory Ready ;----------------------------------------------------------------------- - ;Start, Power ON, Reset ;.include"m8def.inc" ;.ORG OVF0addr ;rjmp Timer_0 main: ldi r16,high(ramend) out sph,r16 ldi r16,low(ramend) out spl,r16 ;---------------------- ldi r16,0xff out ddrb,r16 ;------------------- ldi r16,0b00000101 out TCCR0,r16 ldi r16,0b00000001 out TIMSK,r16 ldi r16,0 sei ;--------------------- mainloop: rjmp mainloop Timer_0: com r16 out portb,r16 reti
Das hat spess53 im Prinzip schon gesagt: Dir fehlt der Sprung nach main. Wenn Du den Controller einschaltest, beginnt er mit der Programmausführung an Adresse 0x0000. Dort steht zunächst nichts (0xff, leerer Flash-Speicher), bis irgendwann das "rjmp Timer_0" kommt. Er springt in den Interrupt-Handler (ohne im Interrupt-Modus zu sein), toggelt den Port (ohne daß er als Ausgang geschaltet ist, aktiviert also die internen Pull-Ups), und verlässt den Interrupt, was ihn vermutlich ins Nirvana befördert, weil weder Stack aufgesetzt ist, noch eine Rücksprungadresse bereit liegt (weil eben kein Interrupt stattfand). Durch den eingefügten Sprung nach main ("rjmp main") zu Beginn Deines letzten Programms wird nun tatsächlich die Hauptfunktion ausgeführt. Davor war es schlicht und einfach irrelevant, was Du dort hingeschrieben hast, es wurde übersprungen. Klassische Erkenntnis: kaum macht man's richtig und schon geht's. :-) Gruß, Felix
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.