www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Counter will nicht


Autor: Andreas Brede (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute, habe mir nen Counter erstellt doch dieser will nicht so
ganz hat einer eine Idee wieso nicht hier mein Sourecode, ich hoffe ihr
findet meinen Fehler, ich verzweifel!

Auch so kleine Beschreibung wie es mal laufen sollte Taster wird 3 mal
gedrückt bei falender Flanke löst ein Interrupt Port B aus (LED).
Vielen Dank!


.include "8515def.inc"
.def temp = r16
.equ start = 256 - 3

rjmp reset           ; Reset Handler
reti                 ; IRQ0 Handler
reti                 ; IRQ1 Handler
reti                 ; Timer1 Capture Handler
reti                 ; Timer1 compare Handler
reti                 ; Timer1 Overflow Handler
rjmp counter0        ; Timer0 Overflow Handler
reti                 ; SPI Transfer Complete Handler
reti                 ; UART RX Complete Handler : RXCIE
reti                 ; UDR Empty Handler
reti                 ; UART TX Complete Handler
reti                 ; ADC Conversion Complete Interrupt Handler
reti                 ; EEPROM Ready Handler
reti                 ; Analog Comparator Handler

reset:
  ldi temp, RAMEND
  out SPL, temp  ; set stack pointer

  ldi temp, 0x00
  out DDRD, temp ; PORTD configured for input
  ldi temp, 0xFF
  out DDRB, temp ; PORTB configured for output
  ldi temp, 0xFF
  out PORTB, temp ; LEDs ausschalten

  ldi temp, 1<<TOIE0  ; 0000 0010
  out TIMSK, temp  ; timer 0 interrupt ein
  ldi temp, start
  out TCNT0, temp ; Startwert des Counters
  ldi temp, 0b00000111
  out TCCR0, temp  ; Counter inkrementiert bei fallender Flanke an Pin
T0 (Pin 4 von Port D)

  sei ; interrupts generell aktivieren

main:
  loop:
    rjmp loop


;--------------------------------------------------
counter0:
  ldi temp, 0x00
  out PORTB, temp

  ; wait ca. 1 seconds
  ldi r17, 0
  ldi r18, 0
  ldi r19, 35
  delay:
    dec r17
    brne delay
    dec r18
    brne delay
    dec r19
    brne delay

  ldi temp, 0xFF
  out PORTB, temp

  ldi temp, start
  out TCNT0, temp ; Startwert des Counters neu einstellen

reti

Autor: Andreas Brede (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh diese Zeilen aus dem Code bitte nicht beachten

main:
  loop:
    rjmp loop


Mfg Andreas

Autor: Andreas Brede (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir dann keiner Helfen?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
musst du vielleicht auch mal die Antworten auf deine diversen crossposts
wenigstens lesen. Wie du siehst, ist das nicht sonderlich beliebt :-(

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Kann mir dann keiner Helfen?"

1. Beschreibung der anwendung
2. Beschreibung des Programms
3. welche Funktion geht anders als erwartet
4. wie geht sie anders als erwartet
5. wie sollte es sein, wenns richtig wäre

Je ausführlicher, umso größer die Chance, daß jemand einen Blick
riskiert.

So aber, ohne alles, wirds wohl kaum einer tun.


Peter

Autor: Joachim Schäfer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mich erbarmt und das Programm durch den Simulator gejagt. Das
erste Problem ist offenbar, dass T0 eben NICHT auf "Pin 4 von Port D"
liegt, sondern auf PB0, also Pin 0 von PortB. Ausserdem wird der Counter
mit Belegung 111 im TCCR0-Register bei STEIGENDER Flanke inkrementiert,
die richtige Belegung wäre 110.
Zweitens hast das Programm offenbar mehr oder weniger 1:1 aus dem "Wie
sag ich's meinem AVR" entnommen, aber dort ist das Programm für den
4433, nicht für den 8515 - da sind die Probleme natürlich
vorprogrammiert, wenn man nicht aufpasst.
Zum einen solltest Du schon mal
ldi temp, RAMEND
out SPL, temp

ersetzen durch
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, LOW(RAMEND)
out SPL, temp

zum anderen solltest Du die Interrupt-Tabelle am Anfang ersetzen durch
rjmp reset
.org OVF0addr
rjmp counter0
denn ansonsten wird nicht einmal der richtige Interrupt aufgerufen.

Da Dein Eingabepin nun also aber auf PortB liegt, nicht auf PortD,
musst Du natürlich auch die ganzen PORTB und PORTDs in Deinem Code
vertauschen etc.
Im Anhang findest Du eine Version, in der die genannten Fehler
korrigiert sind.

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.