Hier erstmal der Code: #include <avr/io.h> #include <stdint.h> //für die Zahlen #include <avr/wdt.h>// watchdog volatile unsigned char zeitget(void); unsigned char stand; int main (void) { TCCR0B|=0b00000011;//Timer0 auf prescaler 64 --> Periode ca. 3,4ms bei 4,8Mhz DDRB=(0 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3)|(0 << PB4);//|(0 << PB5);//Port b0 eingang, b1 - b2-b5 Ausgang PORTB=(0 << PB0)|(0 << PB1)|(0 << PB2)|(0 << PB3)|(0 << PB4);//|(0 << PB5);//keine Pullups bzw. high stand=0; TCNT0=0;//counter0 mit 0 initialisieren wdt_enable(7);//Reset nach 1,9s kein signal while (1) { zeitget(); switch(stand) { case 0 : PORTB = (0 << PB1)|(0 << PB2)|(0 << PB3)|(0 << PB4); break; case 1 : PORTB = (0 << PB1)|(0 << PB2)|(0 << PB3)|(0 << PB4); break; case 2 : PORTB = (1 << PB1)|(1 << PB2)|(0 << PB3)|(0 << PB4); break; case 3 : PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4); break; } }//end while }//end main //Funktionen unsigned char zeitget(void)//Misst die Zeit, die das signal high ist. { if (PINB & (1<<PB4)) //wenn high { wdt_reset();//wenn ppm signal da, wird der watchdog geresettet TCNT0=0; while ((PINB & (1<<PB0))) {//warten solange low if (TCNT0==0) stand =0; if (TCNT0<80) stand =1; if ((TCNT0 > 80)&&(TCNT0<110)) stand =2;//ungefähr 1,4ms - 1,6ms if ((TCNT0 > 110)) stand =3; } } return stand; } Zur Funktion: Entsprechend der Dauer eines Pulsbreitenmodulierten signales sollen portpins eingeschaltet werden. Ich hab den Mega 8 und tiny13 auf dem Gleichen Steckbrett programmiert, also kein Hardwareproblem. Das TCCR0-Register hab ich auch schon auf Tccr0b umbenannt. Der einzige wirkliche unterschied zum mega 8 code liegt darin, dass ich jetzt pb0 als eingang nehme und pb1-4 als ausgang. beim mega 8 hatte ich pb0 als eingang und portd als ausgänge. Beim mega8 funzt die Sache und bei dem tiny13 nicht mehr. Ich steh echt auf dem Schlauch, wäre daher für Hilfe echt dankbar.
Wie siehts aus Experten? Kann keiner einem Anfänger etwas auf die Sprünge helfen? Gruß, Uli
Was auf gleich auffällt:
> case 3 : PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4); break;
Da kommt immer 0 raus und die ganze Formulierung ist recht unsinnig („/”
statt „|” am Ende).
>Der einzige wirkliche unterschied zum mega 8 code liegt darin, >dass ich jetzt pb0 als eingang nehme und pb1-4 als ausgang. >DDRB=(0 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3)|(0 << PB4); sagt aber was anderes. ^^^ > unsigned char zeitget(void)//Misst die Zeit, die das signal high ist. > { > > if (PINB & (1<<PB4)) //wenn high > { > wdt_reset();//wenn ppm signal da, wird der watchdog geresettet > TCNT0=0; > while ((PINB & (1<<PB0))) > {//warten solange low > if (TCNT0==0) stand =0; > if (TCNT0<80) stand =1; > if ((TCNT0 > 80)&&(TCNT0<110)) stand =2;//ungefähr 1,4ms - 1,6ms > if ((TCNT0 > 110)) stand =3; > } > } > > return stand; > } Den Ablauf verstehe ich nicht. Der Watchdog wird nur resettet, wenn PINB4 high ist. Was ist, wenn er es in der Watchdogzeit nicht schafft? => Reset vermutlich, aber der Code fehlt ja. Dann setzt Du TCNT0 auf Null. Wo wird denn eigentlich der Counter gestartet? Dann kommt eine Schleife mit der Bedingung, daß PINB0 high ist. Es folgt aber ein Kommentar //warten solange low. Dann kommt ein Test, ob TCNT0 Null ist. Muß er ja, hast ihn ja vorher auf Null gesetzt. Dann kommt ein Test, ob TCNT0 kleiner als 80 ist. Logisch ist er das; hast ihn ja auf Null gesetzt. Nun änderst Du die Variable Stand etc, case 0 und case 1 sind gleich etc.... Ich glaube nicht, daß das vorher auf einem Tiny so gelaufen sein soll.
Danke für die Infos. Ich muss dann erstmal Fehler korrigieren. U
Hc Zimmerer schrieb: > Was auf gleich auffällt: > >> case 3 : PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4); break; > > Da kommt immer 0 raus und die ganze Formulierung ist recht unsinnig („/” > statt „|” am Ende). Der Fehler ist klar, aber wieso kommt - sofern richtig geschrieben - nur null raus. Wie sollte es denn richtig sein? Danke.
Uli schrieb: >> Da kommt immer 0 raus und die ganze Formulierung ist recht unsinnig („/” >> statt „|” am Ende). > > Der Fehler ist klar, aber wieso kommt - sofern richtig geschrieben - nur > null raus. Wie sollte es denn richtig sein? Danke. Was an: >> Da kommt immer 0 raus und die ganze Formulierung ist recht unsinnig („/” >> statt „|” am Ende). hast Du nicht verstanden?
Dass da kein / sondern | reinsoll ist ja klar. Aber warum wird der Ausdruck zu null? Ich dachte der ist mit dem Fehler ganz ungültig, aber null? Übrigens hilft man einem Anfänger wenig, ihm schlaue Gegenfragen zu stellen. Erklären, wo es hängt hilft da besser. ;) Gruß, Uli
Uli schrieb: > Aber warum wird der > Ausdruck zu null? Was an Grrr schrieb: > (1 << PB4) > (1 << PB1)|(1 << PB2)|(1 << PB3) hast Du nicht verstanden? Uli schrieb: > Übrigens hilft man einem Anfänger wenig, ihm schlaue Gegenfragen > zu stellen. Erklären, wo es hängt hilft da besser. Eben. Die Erklärung wurde Dir gegeben. Wenn Du sie nicht verstehst, obwohl sie trivial ist, dann muss man nachfragen, was Du an der Erklärung nicht verstanden hast. Im übrigen wirst Du, wenn Du andere um Hilfe fragst mit der Art von Hilfe vorlieb nehmen müssen, die man Dir gibt. Ich, zum Beispiel, gebe Hilfe zur Selbsthilfe, aber ich kaue nicht jedes Detail vor.
Ich glaub ich habs. Die Threshholds für logisch 1/0 beim mega 8 liegen in einer anderen Kante als beim Tiny 13. Versuche es heute Abend mal umzubasteln und berichte. gruß, Uli
Uli schrieb:
> PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4)
entspricht in dezimaler Schreibweise:
PORTB = (2 + 4 + 8) / 16 = 0.875
Und 0.875 auf Integer gecastet wird zu 0. Also enthält PORTB den Wert 0.
Wenn es dir zu blöd ist auf meine dumme Frage auf eine konstruktive Weise zu antworten, machs wie die anderen, antworte garnicht. Falls du glaubst, ich will mir alles vorkauen lassen, dem ist nicht so. Und selbst wenn, das ist ein Forum das genau dafür da ist. Meine Güte, selbst das Internet ist voll von Leuten, die von ihren Eltern nie umarmt worden sind. Uli
Thomas schrieb: > Uli schrieb: >> PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4) > > entspricht in dezimaler Schreibweise: > PORTB = (2 + 4 + 8) / 16 = 0.875 Nö. PORTB = 2 + 4 + 8 / 16 = 6.5
1 | PORTB = (1 << PB1)|(1 << PB2)|(1 << PB3)/(1 << PB4); |
2 | 48: 86 e0 ldi r24, 0x06 ; 6 |
3 | 4a: 88 bb out 0x18, r24 ; 24 |
Peter
Uli schrieb: > Wenn es dir zu blöd ist auf meine dumme Frage auf eine konstruktive > Weise zu antworten, machs wie die anderen, antworte garnicht. Es ist mir nicht zu blöd, sonst hätte ich garnicht geantwortet. Du machst einen Fehler wenn Du meine Art zu antworten persönlich nimmst. Sie sollte keine Kritik an Deiner Art zu fragen sein. > Und selbst wenn, das ist ein Forum das genau dafür da ist. Das Forum ist das was wir daraus machen. Nicht was Du denkst. Das Dir meine Antwort nicht gefällt ist ja ok. Aber mir deswegen ein Fehlverhalten vorzuwerfen ist schlicht absurd.
Grrr schrieb:
> Na toll. Voll in die Sch... getreten.
Mach' Dir nix d'raus, das passiert mir auch immer wieder mal. Hilfe zur
Selbsthilfe kommt bei einigen Leuten nicht an.
...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.