hallo, ich wende mich noch an alle an, und hoff könnt ihr mir noch helfen. ich will an atemga88 mittel taster die pulsbreite meiner pwm ansteuer d.h durch z.b drück des taster s1 die puslbreite schmaller ist bwz. s2 umgekehrt; diepulsbreite sollte sich zwischen 4ms und 20ms verändern . ich habe das ganze mit dem timer1, um meine frequenz gleich zu halten hab ich den top-wert an icr1 gemacht. jetzt weiss ich sollt einfach den ocr1b in der whileschleife durch die passende befehle um mittel taster zu steuern,anspielen lassen. aber das funktioniert nicht, und ich verstehe net wo der fehler sein könnte. so sieht das code aus. // Funktion Tastenentprellen // ---------------------------------- inline uint8_t debounce(volatile uint8_t *port, uint8_t pin) { if(!(*port & (1<<pin))) { _delay_ms(100); if((*port &(1<<pin))) { _delay_ms(100); return (true); } } return 0; } int main (void) //Hauptprogramm { DDRB |= (1 << PB2); TCCR1A |= (1<<COM1B0)|(1<<COM1B1) ; TCCR1B |= (1<<WGM13)|(1<<CS10)|(1<<CS12); ICR1 = 450; while(1) { OCR1B=340; ButtonControl(); if(S1) { OCR1B=OCR1B+10; S1=false; } if(S2) {OCR1B=OCR1B-10; S2=false; } return 0; } } void ButtonControl() { char SavePORTC = PORTC; char SaveDDRC = DDRC; PORTC |= (1<<PC0) | (1<<PC1) ; DDRC &= ~((1<<DDC0) | (1<<DDC1)); if (debounce(&PINC, PC0)) //Taste S1 {S1=true; } if (debounce(&PINC, PC1)) //Taste S2 {S2=true; } PORTC = SavePORTC; DDRC = SaveDDRC; // Laden des alten Portzustandes } danke
in der funktion: inline uint8_t debounce(volatile uint8_t *port, uint8_t pin) --> if(!(*port & (1<<pin))) ersetzen durch: while(!(*port & (1<<pin))) Freundliche Grüsse Dave
Dave schrieb: > in der funktion: > inline uint8_t debounce(volatile uint8_t *port, uint8_t pin) > > --> if(!(*port & (1<<pin))) > > ersetzen durch: > > while(!(*port & (1<<pin))) In dem Fall nicht. debounce liefert false, wenn zur Zeit keine Taste gedrückt ist. AUch wenn ich mit dieser debounce Funktion nicht glücklich bin, ist sie schon so in Ordnung, wie sie im Original ist.
vianney schrieb: Einrückungen!
1 | int main (void) |
2 | //Hauptprogramm
|
3 | {
|
4 | DDRB |= (1 << PB2); |
5 | TCCR1A |= (1<<COM1B0)|(1<<COM1B1) ; |
6 | TCCR1B |= (1<<WGM13)|(1<<CS10)|(1<<CS12); |
7 | ICR1 = 450; |
8 | |
9 | while(1) |
10 | {
|
11 | |
12 | //
|
13 | // Wenn du innerhalb der Schleife den OCR1B jedesmal erneut auf
|
14 | // 340 setzt, dann wird es wohl nichts werden mit: Bei jedem Tastendruck
|
15 | // zum OCR1B 10 dazu oder weg
|
16 | //
|
17 | OCR1B = 340; |
18 | ButtonControl(); |
19 | |
20 | if(S1) |
21 | {
|
22 | OCR1B = OCR1B+10; |
23 | S1 = false; |
24 | }
|
25 | |
26 | if(S2) |
27 | {
|
28 | OCR1B = OCR1B-10; |
29 | S2 = false; |
30 | }
|
31 | |
32 | //
|
33 | // Ah ja.
|
34 | // der return innerhalb der while-Schleife
|
35 | // Tja. Das wird dann wohl nichts, mit einer Endlosschleife
|
36 | // denn der Schleifenrumpf wird nur einmal durchlaufen, und danach
|
37 | // gehts aus main raus.
|
38 | // Ist dir das denn gar nicht aufgefallen, dass nach dem return 2 Stück
|
39 | // schliessende } in deinem Code auftauchen und damit das return innerhalb
|
40 | // irgendeiner Kontrollstruktur sein muss.
|
41 | // Ach ne, ich vergass: Du hast ja auf konsistente Einrückungen gepfiffen
|
42 | //
|
43 | return 0; |
44 | }
|
45 | }
|
Fazit: Deine beiden Fehler hätte man ganz leicht sehen können, wenn man sich an Codeformatierungen hält.
1 | void ButtonControl() |
2 | {
|
3 | char SavePORTC = PORTC; |
4 | char SaveDDRC = DDRC; |
5 | |
6 | PORTC |= (1<<PC0) | (1<<PC1) ; |
7 | DDRC &= ~((1<<DDC0) | (1<<DDC1)); |
Lass das DDR Register und das Port Register in Ruhe! Diese Einstellung macht man einmal am Programmanfang und dann lässt man sie in Ruhe.
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.