www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmege8-Timer0


Autor: Kaveh Deiport (kaveh)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Vielleicht solltest du mal den Stackpointer initialisieren.

MfG Spess

Autor: Kaveh Deiport (kaveh)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ignoriere den 2.Satz

MfG Spess

Autor: Kaveh Deiport (kaveh)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kaveh Deiport (kaveh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch, es funktioniert jetzt. es lag wohl an rjmp main.
mfg
kaveh

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.