Hallo
Es geht bei meinem Problem um einen DCC-Funktionsdecoder für die Modellbahn.
Den ASM-Code habe ich dafür aus einem anderen Forum und er funktioniert ohne Probleme auf einem Tiny2313 mit int. Oszillator auf 8Mhz. (mit Timinganpassungen in den ISR's für gesetztes CKDIV8 funktioniert auch).
Nun wollte ich das ganze auf einen Tiny13 umschreiben, was ja eigentlich auch geklappt hat, denke ich mir. Nur es werden keine DCC-Signale erkannt (drücken der Tasten F1-F4 auf der Roco Lokmaus2).
Habe mir extra noch ein Testprogramm geschrieben, welches ein Port am Tiny13 oder auch Tiny2313 toggelt, um die Werte für die ISR's zu ermitteln.
Hier mal die Initialisierung-Routine des Tiny13:
Auskommentierte Sachen nicht beachten....Code:Reset: ; Programm Kaltstart cli ; alle Interrupts ausschalten ldi temp,low(RAMEND) ; Stackpointer setzen out SPL,temp ; ldi TEMP,0b01001101 ;77 ; out OSCCAL,TEMP ; ldi temp,0b11111111 ; PB als Ausgang ; out DDRB,temp ; clr null ; alles auf low ; out portb,null ldi TEMP,0b00111101 ;PB0/2/3/4/5 als Ausgang, PB1 als Eingang out DDRB,TEMP clr null ; alles auf low out portb,null ldi TEMP,0b00000011 ; Bit0/1 ISC01 ISC00 Interupt Sense Control 0 out MCUCR,TEMP ; 0 0 Low Level of INT0 generate Interrupt ; 0 1 jeder Wechsel of INT0 ; 1 0 die fallende Flanke of INT0 ; 1 1 die steigende Flanke von INT0 erzeugt Interrupt ; Bit2/3 ISC11 ISC10 Interupt Sense Control 1 ; wie Bit0/1 ; Bit4 SM Sleep Modes ; Bit5 SE Sleep Enable ; Bit6/7 Reserve ldi TEMP,0b01000000 ; Bit0/5 Reserve out GIMSK,TEMP ; Bit6 INT0 Interrupt enable ldi TEMP,0b00000010 ; Bit0 Reserve out TIMSK0,TEMP ; Bit1 TOIE0 Timer/Counter0 Overflow Interrupt Enable ldi TEMP,0b01000000 ; lösche externen Interupt 0 out GIFR,TEMP ldi TEMP,0b00000010 ; lösche Timer0 Interupt out TIFR0,TEMP
Und hier die ISR's
Code:;************************************************************************************************ ;* Interruptserviceroutinen * ;************************************************************************************************ ;************************************ ;* Eingangsinterrupt * ;************************************ ; wird bei jeder steigenden Flanke an int0/PB1 ausgelöst ; timer0 auf 78us vor überlauf setzen ( Highbit mind. 52us+50% ) ; dazu teiler auf 8 (1us) ; zur sicherheit überlaufintbit von timer0 noch löschen ; könnte ja inzwischen gesetzt sein EXT_INT0: in intsreg,sreg ;sreg sichern clr inttemp ;timer anhalten out tccr0b,inttemp ldi inttemp,168 ;Zähler setzen out tcnt0,inttemp in inttemp,tifr0 ;überlauf timer0 löschen cbr inttemp,0b00000010 out tifr0,inttemp sbr flag,(1<<messen) ;für bit "messen" ein cbr flag,(1<<keindcc) ;bit für "keine befehle da" löschen ldi inttemp,0b00000001 ;timer mit Teiler auf ck/8 starten out tccr0b,inttemp out sreg,intsreg ;sreg zürück ; sbi portb,4 reti ;und fertig ;************************************ ;* Timer_0_interrupt * ;************************************ ; wird ca 78us nach ext_int ausgelöst und liest dann bit von int0/PB1 ein ; danach max 10000us auf neuen ext_int warten ; dazu teiler auf 1024 TIM0_OVF: ; cbi portb,0 in intsreg,sreg ;sreg sichern clr inttemp ;timer anhalten out tccr0b,inttemp in inttemp,pinb ;port einlesen sbrs flag,messen ;wenn messen aktiv 1x springen rjmp warten_aktiv ;sonst gehe zu com inttemp ;port umdrehen bst inttemp,2 ;bit d2 holen bld flag,bit ;und in flag bit0 sichern sbr flag,(1<<neuesbit) ;neues bit da setzen cbr flag,(1<<messen) ;flag für messen aus ldi inttemp,229 ;Zähler auf 161 für tiny13 mit 9,6mhz(176 bei 2313 mit 8mhz) out tcnt0,inttemp ldi inttemp,0b00000100 ;timer mit Teiler auf ck/1024 starten out tccr0b,inttemp out sreg,intsreg reti warten_aktiv: ;ca 10000us kein bit mehr eingetroffen sbr flag,(1<<keinDCC) ;bit für keine befehle setzen out sreg,intsreg reti
Wie gesagt auf dem 2313 läuft es, nach Anpassen der Zählerwerte fürs tcnt0-Register an den entsprechenden Takt, ohne Probleme.
Nur der Tiny13 will nicht so recht.Und der 2313 ist für den Einsatzzweck zu "übertrieben".
Hat jemand eine Idee, was da noch falsch sein könnte ??
Danke







Und der 2313 ist für den Einsatzzweck zu "übertrieben".
Zitieren

Lesezeichen