Hallo! ich habe ein Problem mit meinen C-code! if (bit_is_set(PINC,Rot_Eingang)) {bit_on(PORTC,Rot_Ausgang);} else {bit_off(PORTC,Rot_Ausgang);} if (bit_is_set(PINC,Gruen_Eingang)) {bit_on(PORTC,Gruen_Ausgang);} else {bit_off(PORTC,Gruen_Ausgang);} if (bit_is_set(PINC,Blau_Eingang)) {bit_on(PORTC,Blau_Ausgang);} else {bit_off(PORTC,Blau_Ausgang);} oder uint8_t x; x= PINC; x *=8; PORTC = x; MEGA8 8MHZ; würde gerne ein Eingangssignal direkt durch µC auf einen Ausgang leiten um das Eingangsignal zu überwachen und dann bestimmte Aktionen an den Ausgangspins auszugeben. Habe aber jetzt das Problem wenn ich die Frequenz am Eingang immer weiter hoch drehe beginn ab einer Frequenz von 200 bis 300Hz ein doppel trg auf dem Ausgang. ist der µC zu langsam? hätte jemand eine Idee ob und wie das Funktionieren könnte? Danke!
Du willst Eingangspin => Ausgangspin?
1 | if ( PIND & (1<<PD3) ) |
2 | {
|
3 | PORTB |= (1<<PB7); |
4 | }
|
5 | else
|
6 | {
|
7 | PORTB &= (1<<PB7) |
8 | }
|
Ja will Eingangspin gleich Ausgangspin! if (bit_is_set(PINC,PC0)) {bit_on(PORTC,PC4);} else {bit_off(PC4);} if (bit_is_set(PINC,PC1)) {bit_on(PORTC,PC5);} else {bit_off(PORTC,PC5);} if (bit_is_set(PINC,PC2)) {bit_on(PORTC,PC6);} else {bit_off(PORTC,PC6);} aber so habe ich eben doppel trg. am Ausgang bei höheren Frequenzen hätte gerne ein sauberes Signal am Ausgang.
>doppel trg. am Ausgang Was soll das sein? >sauberes Signal am Ausgang Hast du mit meinem Beispiel. >asm("mov ziel, quelle"); Kann keine Bits kopieren
Hast du vielleicht die Endlosschleife drumrum vergessen? Sonst wird das ja nur ein einziges Mal abgearbeitet nach Reset. Mach mal Nägel mit Köpfen: komplettes Programm, welcher Controller, welcher Compiler, vielleicht auch gleich noch das Makefile mit dazu.
ich will ja auch C lernen :-) mein Gedankenansatz dazu sähe so aus: PORTC=(((PINC&7)<<4)|(PINC&143)) //PC0,1,2,3,7 unverändert lassen würde das so funktionieren?
Ja. Behalte aber mal im Hinterkopf, dass du im Ausdruck zwei Einleseoperationen an PINC hast und sich die Pegel zwischen den Aktionen ändern können. Lesbarer kann man die Bitmanipulation mit der 1<<Bitnummer Schreibweise schreiben.
ich wrote: > aber so habe ich eben doppel trg. am Ausgang bei höheren Frequenzen > hätte gerne ein sauberes Signal am Ausgang. Dann mußt Du uns erstmal den Rest des Programms zeigen, in den gezeigten Zeilen liegt der Fehler jedenfalls nicht. Aber es wird eh kaum klappen, 3 PWMs jitterfrei durch nen MC durchzuschleifen, wenn er auch noch was anderes machen soll. Peter
OK Dann wird es wohl nicht klappen mit höheren Frequenzen ,werde dann nur bis 200Hz PWM gehen ums durchzuschleifen . Das reicht mir dann aus ! Jörg Wunsch es ist eine Endlosschleife drum!soviel dazu!!! Auszug: int main(void) { init_devices(); uint16_t Signalpegel=0; bit_on(TIMSK,TOIE1); while(1) { //------------------------------High------------------------------------ --------- if ((bit_is_set(PIND, PD2)) && (bit_is_set(PIND,PD3))) //High { RGB(); Signalpegel = AdcWert(6); Summe(Signalpegel); } //-------------------------------middle--------------------------------- -------- if ((bit_is_clear(PIND, PD2)) && (bit_is_set(PIND,PD3))) //middle { RGB(); Signalpegel = AdcWert(6); Summe(Signalpegel); } //-------------------------------low------------------------------------ --------- if ((bit_is_set(PIND, PD2)) && (bit_is_clear(PIND,PD3))) //low { RGB(); Signalpegel = AdcWert(6); Summe(Signalpegel); } //------------------------------Test------------------------------------ --------- if ((bit_is_clear(PIND, PD2)) && (bit_is_clear(PIND,PD3))) //Test { Test(); } } } //-------------------------------------------------------------------- void RGB(void) { if (bit_is_set(PINC,PC0)) {bit_on(PORTC,PC4);} else {bit_off(PC4);} if (bit_is_set(PINC,PC1)) {bit_on(PORTC,PC5);} else {bit_off(PORTC,PC5);} if (bit_is_set(PINC,PC2)) {bit_on(PORTC,PC6);} else {bit_off(PORTC,PC6);} }
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.