Forum: Mikrocontroller und Digitale Elektronik Counter will nicht


von Andreas Brede (Gast)


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

von Andreas Brede (Gast)


Lesenswert?

Oh diese Zeilen aus dem Code bitte nicht beachten

main:
  loop:
    rjmp loop


Mfg Andreas

von Andreas Brede (Gast)


Lesenswert?

Kann mir dann keiner Helfen?

von crazy horse (Gast)


Lesenswert?

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

von Peter D. (peda)


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

von Joachim Schäfer (Gast)


Angehängte Dateien:

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.

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.