Hallo, ich versuche grade auf einer selbst zusammengelöteten Platine (Schaltplan siehe Anhang) eine Aufgabe zu lösen, komme allerdings überhaupt nicht voran, da ich keine Ahnung von C-Programmierung oder auch von Mikrocontrollern habe. Vielleicht kann mir ja jemand helfen - habe auch schon mal ein Probeprogramm (Lauflich mit AD-Wandler) laufen lassen, verstehe dabei aber auch schon (mangels Kenntnissen) wie das genau arbeitet. Die beiden angegebenen Funktionen sollen gemeinsam im Atmega16 des Demo-Boards realisiert werden! Die Beschreibung der Funktionalität soll in der Programmiersprache C erfolgen! Realisieren eines Lauflichts: Mit einem der beiden Potentiometer soll die Frequenz (Weiterschaltung von einem Status in den folgenden Status) des Lauflichts im Bereich von 0Hz (Stillstand) bis 2Hz (Genauigkeit: +/-0,1Hz) möglichst fließend einstellbar sein. Die Taktung soll mit Hilfe von einem der eingebauten Timer realisiert werden und es soll mindestens eine zugehörige Interruptserviceroutine sinnvoll verwendet werden! Hierzu soll mindestens mit einer Genauigkeit von 10 Bit gearbeitet werden. Durch die Schalter 1 (Bit 0) und 2 (Bit 1) (Beschriftung beachten!) sollen die verschiedenen Darstellungen des Lauflichts ausgewählt werden können. Ist ein weiterer Schalter aktiviert soll die Funktionalität des Lauflichts deaktiviert sein um eine Nutzung der LED's für andere Aufgaben zu ermöglichen. Bei Umschaltung soll das nun ausgewählte Lauflicht, beginnend im ersten Zustand, in der beschriebenen Abfolge mit der eingestellten Frequenz durchlaufen werden. Diese seien wie folgt belegt1 : „00“: „+-------“ → „-+------“ → „--+-----“ → „---+----“ → „----+---“ → „-----+--“ → „------+-“ → „-------+“ → usw. mit „+-------“ „01“: „+------+“ → „-+----+-“ → „--+--+--“ → „---++---“ → „--+--+--“ → „-+----+-“ → „+------+“ → „--------“ → usw. mit „+------+“ „10“: „++------“ → „-++-----“ → „--++----“ → „---++---“ → „----++--“ → „-----++-“ → „------++“ → „-----++-“ → „----++--“ → „---++---“ → „--++----“ → „-++-----“ → usw. mit „++------“ „11“: „+-------“ → „++------“ → „+++-----“ → „++++----“ → „+++++---“ → „++++++--“ → „+++++++-“ → „++++++++“ → „-+++++++“ → „--++++++“ → „---+++++“ → „----++++“ → „-----+++“ → „------++“ → „-------+“ → „--------“ → usw. mit „+-------“ Grundeinstellung: Zu Beginn sei die mit S7 gewählte Variante voreingestellt! Realisieren einer Addition: Ist das Lauflicht nicht aktiv sollen die Stellungen beider Potentiometer zyklisch, in der zugehörigen Interruptserviceroutine, mit einer Genauigkeit von 7 Bit ermittelt werden. In der Hauptroutine der zu entwickelnden Software sollen diese Werte nun addiert werden. Das Ergebnis der Addition dieser beiden 7-Bit-Zahlen soll über die 8 LED's ausgegeben werden. Das Leuchten einer LED signalisiert dass dieses Bit gesetzt ist!
Ist eine lösbare Aufgabe. Ich frage mich gerade, warum Du eine solche Aufgabe lösen willst, wenn Du keine Ahnung von nichts hast... Aber mit etwas Fleiß kriegen wir das durchaus hin. Wo genau verstehst Du die Beispielcodes nicht? Hast Du gar keine Erfahrung mit Programmiersprachen oder ist nur C das Problem?
@ Paul: Du hast Glück. Mit dem uC kannst du das schaffen. Mach mal irgendwas, und schreib dann, was noch nicht geht. Die ganze Arbeit nimmt dir hier auch keiner ab. BTW: Pete hats da mit seinen 72 Flipflops wesentlich schwerer :-o
Habe bisher eigentlich nur wenig mit Programmiersprachen am hut gehabt. Und mit C eben noch gar nichts =/
Bisher bin ich so weit, bin aber auch noch nicht ganz da durchgestiegen, warum hier was passiert: #include <avr/io.h> // Package IO einbinden #include <util/delay.h> // #include <avr/interrupt.h> // Einbindung von Interrupt Package volatile int counter = 0; volatile int counter_max = 1000; int main (void) { int ledcnt = 0; DDRC = 0xff; // Initialisierung von C -- Port C Data Direction Register (DDRC) - 0xff = maximum ADMUX = 0x06; // ADC einstellen und starten ADCSRA = 0xFE; TCCR0 = 0x05; // Timer 0 einstellen und starten TIMSK = 0x01; TCNT0 = 0xe9; sei(); // Beginn des Interrupts PORTC = 0xff; // Initialisierung von Port C while(1) // Endlosschleife { if( counter >= counter_max ) { counter = 0; ledcnt++; PORTC = ~( 1 << ( ledcnt & 0x07 ) ); } } } ISR(ADC_vect) // Interrupt System Routine { counter_max = ( ADC + 10 ) << 1; // Ergebnisausgabe von ADCHigh auf C } ISR(TIMER0_OVF_vect) { TCNT0 = 0xea; counter++; }
Der Code ist doch sehr schön kommentiert. OK, die Zeile PORTC = ~( 1 << ( ledcnt & 0x07 ) ); wird ein C-Anfänger nicht verstehen, das gebe ich zu. Im Prinzip kann man die Aufgabe durch Erweiterung dieses Codes lösen. Bevor ich jetzt hier viel, sehr viel schreibe, arbeite dies hier durch: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial Detailfragen können wir sicher klären.
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.