Hi Leute! Ich lass mir von PC Daten an den Mikrocontroller senden. Dieses möchte ich ggf mit Tastendruck vergrößern oder verkleiner.Das Problem ist jetzt, dass das mit dem Aufaddieren bzw. Subtrahieren nicht klappt.Lass mir das, was der Mikrocontroller vom PC kriegt ausgeben, und da passiert nicht!! Weiß jemand vielleicht, was hier falsch ist??? if (PIND=0b00000100) //pind.2==1 { Pcdaten = Pcdaten + 90; } if (PIND=0b00001000) //pind.3==1 { Pcdaten = Pcdaten - 90; } Verwende einen ATmega16 mit dem Atmel Evaluationboard. mfg fuzzy
>if (PIND=0b00000100) //pind.2==1 Falsch siehe AVR GCC tutorial, vielleicht meinst du eher so if (PIND == 0b00000100)
DAs hab ich schon ausprobiert aber daran liegt´s nicht. Kann das sein, dass das daran liegt, dass ich den PortD als Ausgang nutze? Das kann ich aber nicht ändern?????? DDRA = 0x00; //port A input DDRB = 0xFF; // port B output DDRC = 0x00; // port C input PINC=0x00; DDRD = 0xFF;
Du musst die Bits, die Du abfragen willst, schon ausmaskieren. Wie das geht, steht auch im Tutorial. Wenn Du abfragst
1 | if(PIND == 0b00000100) |
2 | {
|
3 | //Code
|
4 | }
|
wird der Inhalt des if-Blocks nur dann ausgeführt, wenn PIND tatsächlich exakt gleich 0b00000100 ist. Wenn irgendwelche anderen Pins noch genutzt werden, über deren Zustand Du nichts weißt, dann haut das halt nicht hin.
>dass ich den PortD als Ausgang >nutze? Das kann ich aber nicht ändern?????? PIN funktioniert dann trotzdem und liefert die AFAIR den Pegel am Ausgang zurück. Wieso kannst du die Richtung nicht ändern? Höchstwahrschein könnte man dir besser helfen, wenn man auch die Schaltung zu deinem Problem und vielleicht auch noch mehr deines Codes sehen würde.
BTW: Wie sind die Tasten angeschlossen? Low-Side (übliche Variante, da interne Pull-Ups nutzbar) oder High-Side (unüblich)? Und: wenn Du die Taster zyklisch abfragst (sprich: wenn Deine if-Abfrage in einer Schleife steht), dann zählt Dir der µC u.U. so schnell hoch, so schnell kannste gar nicht gucken...
> PINC=0x00;
Das ist übrigens völlig wirkungslos. Die PINx-Register sind beim Mega16
allesamt read-only!
Ach ja, wenn Du Taster abfragen willst, die tatsächlich High-Side (also gegen +5V) angeschlossen sind und Du den Port so initialisiert hast wie oben steht, dann haste Dir voraussichtlich schon beim ersten Tastendruck den betreffenden Portpin zerbrutzelt... Wundere Dich dann also nicht, wenn da in Zukunft gar nichts mehr funktioniert. Beim DDRD musst Du natürlich die Pins, die Du als Eingänge nutzen willst, auch als solche konfigurieren, sonst sind Fehlfunktionen und Kurzschlüsse "vorprogrammiert" (im wahrsten Sinne des Wortes!).
Hier das ganze Programm: Könnte sein, dass das mit der Geschwindigkeit zwischen Drücken und Schleifendurchlauf nicht klappt. Aber wie mach ich denn das??? #include<avr/io.h> #include<inttypes.h> #include <avr/pgmspace.h> int main (void) { MCUCSR = (1<<JTD); MCUCSR = (1<<JTD); DDRA = 0x00; //port A input DDRB = 0xFF; // port B output DDRC = 0x00; // port C input //PORTC= 0x00; PINC=0x00; DDRD = 0xFF; int x = 0; unsigned char Bsend; int B,C,g,Pcdaten; ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); ADMUX = 0; ADMUX = (1<<REFS1) | (1<<REFS0); // Select pin ADC0 using MUX // Activate ADC with Prescaler 128 -->16Mhz/128 = 125kHz //Start conversion ADCSRA |= (1<<ADSC); // wait until converstion completed while (ADCSRA & (1<<ADSC) ) for (;;) { ADCSRA |= (1<<ADSC); while (ADCSRA & (1<<ADSC) ) // get converted value // x = ADCW; // x=x-240; //Gesamtbereich von 1024 ( 4x(0bis255)) Subtraktion //damit Mittelstellung für Fuzzifizierung 110 ist x=Pcdaten; Bsend = x & 0b00001111; PORTB = Bsend; Bsend = x & 0b11110000; Bsend=Bsend>>4; Bsend = Bsend + 128; PORTB = Bsend; Pcdaten = PINC; if (PIND==0b00000100) //pind.2==1 { Pcdaten = Pcdaten + 90; } if (PIND==0b00001000) //pind.3==1 { Pcdaten = Pcdaten - 90; } C = 600; B = C - Pcdaten; g = 0; // Anschalten der LED //PORTD &= ~(1<<PD5); PORTD =0b00100000; while (g < Pcdaten) { g = g + 1; } // Ausschalten der LED //PORTD=0; //PORTD |= (1<<PD5); PORTD = 0b00000000; g = 0; while (g < B) { g = g + 1; } } ADCSRA &= ~(1<<ADEN); }
Bitte bitte bitte arbeite zuerst mal das Tutorial durch! Da sind so viele Anfängerfehler drin (inkl. derjenigen, die ich oben schon en détail beschrieben habe), die man alle vermeiden kann, wenn man nicht die Hau-Ruck-Methode anwendet, sondern sich erst mal mit den Grundlagen (und zwar sowohl der Hard- als auch der Software) befasst. Auch die Auswertung von Tastern gehört dazu.
> Könnte sein, dass das mit der Geschwindigkeit zwischen Drücken und > Schleifendurchlauf nicht klappt. Du gehst in die Codesammlung und suchst nach dem Entprell-Thread von Peter Danegger. Die enthält eine Tasten-Einleseroutine, die so ziemlich alle Stückeln spielt die du brauchst. * Einzeltastendruck erkennen * Erkennen ob die Taste länger gedrückt wurde * Entprellen der Tasten Damit ist es dann ein Klacks einen Zahlenwert mit einem Tastendruck zu erhöhen/erniedrigen. Und wenn man länger auf der Taste draufbleibt, dann beginnt der Zahlenwert durch den Autorepeat in annehmbaren Schritten größer / kleiner zu werden. Kann man nur empfehlen das Teil.
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.