Forum: Mikrocontroller und Digitale Elektronik Atmege8-Timer0


von Kaveh D. (kaveh)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Vielleicht solltest du mal den Stackpointer initialisieren.

MfG Spess

von Kaveh D. (kaveh)


Lesenswert?

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

von Serieller (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

Kein 'rjmp main' auf Adresse $0000. Kein Stackpointer initialisiert.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Ignoriere den 2.Satz

MfG Spess

von Kaveh D. (kaveh)


Lesenswert?

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

von Zotteljedi (Gast)


Lesenswert?

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

von Kaveh D. (kaveh)


Lesenswert?

Danke euch, es funktioniert jetzt. es lag wohl an rjmp main.
mfg
kaveh

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
Noch kein Account? Hier anmelden.