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.