Guten Tag liebe Gemeinde,
ich habe ein Problem: ich habe relativ wenig Ahnung von Programmierung,
daher fällt mir das sehr schwer und einen richtigen Ansatz habe ich auch
nicht gefunden. Ich bin mir auch nicht sicher, ob sowas ähnliches schon
mal Thema war im Forum, ich hab vieles Ähnliches gefunden, aber richtig
schlau wurde ich daraus nicht. Bin was Programmieren angeht wirklich ein
Noob.
Für ein kleineres Projekt an der Uni ist meine Aufgabe, eine
RGB-LED-Ansteuerung per Pulsweitenmodulation zu realisieren. Als
Mikrocontroller verwenden wir einen Atmega 328, nebenbei arbeiten wir
mit AVR Studio 4 und einem AVR Dragon. Für das Projekt soll der ADC des
uC verschiedene "Potentiometerstellungen" einlesen und diesen
verschiedene Werte zuordnen( welche dann für die "Stärke" der 3 Farben
stehen, soweit ich das verstanden habe).
Ich hab mich schon viele Nachmittage rangesetzt, aber es mangelt mir
einfach an theoretischem Verständnis dafür.
Deshalb bitte ich euch um Hilfe.
Ich danke im Voraus! :)
LG Max
es hapert an allem ehrlich gesagt. ich komme mit Programmierung einfach
nicht zurecht
und Beispielcodes habe ich, aber nur für Blinken oder so.
also nichts wirklich hilfreiches.
ich kann auch nicht lesen, was in solchen Codes steht, weil ich es
einfach nicht begreife.
Wenn du sagst was für ein Code für den Ansatz nützlich wäre könnte ich
ihn reinstellen :)
Maxx schrieb:> ich kann auch nicht lesen, was in solchen Codes steht, weil ich es> einfach nicht begreife.
Die Angst davor lähmt Dich. Such Dir einen Leidensgenossen und fangt
einfach an mit den Beispielcodes. Diese dann variieren, Effekte
bestaunen. Dann verlierst Du die Angst davor.
google schrieb:> Diese dann variieren, Effekte> bestaunen.
Hab grad gesehen, dass man mit dem Dragon debuggen kann. Also das auch
nutzen, gucken, was mit dem Code passiert.
Vor allem: ANFANGEN, nicht theoretisch erwägen ...
das ist leider wahr, die Angst davor lähmt mich wirklich..
und der Fakt, dass es so ein halbwegs anspruchsvolles Projekt(in meinen
Augen) ist wirkt nicht gerade motivierender auf mich.
Codes kann ich euch leider morgen ab 10:00 erst schicken. Ich hoffe ihr
könnt mir dann helfen.
Hab dann den ganzen Tag Zeit, vielleicht ihr ja auch. :) wäre super
lieb.
Bis dahin gucke ich weiter, versuche, was zu verstehen.
vielleicht könnt ihr mir ja einen ungefähren Aufbau meines Codes liefer,
a la anfangen mit Variablendeklaration, einer Funktion zum einlesen des
Potis, eine Funktion, die diese Werte verarbeitet, dann die Funktion,
die für das Erzeugen einer PWM zuständig ist, wessen Signal dann an die
R,G,B- Elemente der LED's weitergegeben wird, usw..
Ich verstehe komischerweise genau, was dort passieren soll, wie es
angeschlossen wird, was gemacht werden muss, nur hab ich halt sobald es
um's Programmieren geht, wirklich keine Vorstellung, wie ich das
anzustellen habe.
Ich weiß, das ist peinlich, vor allem, wenn man sich stundenlang damit
beschäftigt und es trotzdem nicht begreift...
Maxx schrieb:> vielleicht könnt ihr mir ja einen ungefähren Aufbau meines Codes liefer,> a la anfangen mit Variablendeklaration, einer Funktion zum einlesen des> Potis, eine Funktion, die diese Werte verarbeitet, dann die Funktion,> die für das Erzeugen einer PWM zuständig ist, wessen Signal dann an die> R,G,B- Elemente der LED's weitergegeben wird, usw..
Du hast doch ausreichend Beispielcodes ... sollen wir Deine Arbeit
machen?
nein sollt ihr nicht. ich komme nur halt erst morgen an die Codes ran
und hoffe, dass ihr mir dann helfen könnt.
ich will halt nur heute irgendwas für das Projekt machen, direkt daran
arbeiten kann ich aber erst morgen
Hey Maxx,
ich bin seit noch nicht so langer Zeit mit meinem E-Technik Studium
fertig und ich erinnere mich noch ziemlich gut an einige Kommilitonen,
die mit Programmierung überhaupt nicht klargekommen sind. Ist halt nicht
unbedingt jedermanns Sache.
Ich kann dir nur den Rat geben; such dir einen Kommilitonen der ein
Händchen dafür hat und lass dir von dem auf die Sprünge helfen. Hilfe
aus der Ferne ist ziemlich mühselig und jemand der dir deine Arbeit
macht, findest du hier bestimmt nicht (ist ja auch nicht Sinn des
Studiums).
Also ich verstehe die Aufgabenstellung wie folgt: 3 Potis an 3
ADC-Eingängen (Port A) und 3 LEDs an 3 PWM-Ausgängen (ggf. über
Transistor/MOSFET/Treiber-IC).
Was ich dir als Eckpunkte aber gerne gegen den Kopf werfe, ist wie ich
dein Programm ganz grob aufbauen würde:
Initialisierung (einmal am Programmanfang):
1. Ein- und Ausgänge konfigurieren (DDR Register)
2. ADC konfigurieren (Register siehe Datenblatt)
3. Timer als Dual-Slope PWM konfigurieren, welche Timer du dafür nimmst,
hängt davon ab, an welchen Pins deine LEDs angeschlossen sind. 8-Bit
Modus beim 16-Bit Timer wird wahrscheinlich reichen.
Programmablauf in Endlosschleife:
1. ADC Kanal 1 auswählen
2. AD-Wandlung starten
3. Warten bis Wandlung abgeschlossen ist
4. Ergebnis der Wandlung abholen und um 2 Bits kürzen (10 Bit auf 8 Bit)
5. 8-Bit Ergebnis in das Compareregister des Timers für die 1. LED
schreiben
-> Schritte 1 bis 5 jetzt auch noch für Kanal 2 und 3 Wiederholen
Das ist es im Prinzip schon. Kann man mit Spaghetticode machen, schöner
wird es wenn du die 3 Schritte der Initialisierung in einzelne
Funktionen steckst. Punkt 1 bis 3 der Endlosschleife würde ich auch in
eine Funktion verpacken, die den ADC-Wert als uint16_t zurückgibt und
den Kanal als uint8_t Parameter bekommt. Wenn du für 5. dann auch noch
eine kleine Funktion mit Wert und Kanal als Parameter schreibst, kannst
du die 3 Kanäle in einer for-Schleife abhandeln und musst nicht den
gleichen Code 3-mal schreiben.
Mfg Bimbo385
Was du heute schon machen solltest ist, dir im Datenblatt die Kapitel
und Registerbeschreibungen vom ADC und den Timern durchzulesen, das hält
sich in Grenzen.
Druck dir die Kapitel am besten aus und schreib dir in die
Registerbeschreibungen schon mal rein, wie die Bits für deinen
Anwendungsfall sein müssen. Geh alle Bits einmal durch, dann hast du
eigentlich auch verstanden wie der ADC und die Timer funktionieren.
Wenn du dann die Registerwerte, die du raus hast, hier postest, findest
sich vielleicht auch jemand, der dazu einen Kommentar abgibt ;-)
Mfg Bimbo385
Danke!! ich werde mich damit beschäftigen, ich hoffe, dass das was wird!
einiges habe ich noch nicht ganz verstanden, kannst du vielleicht auf
folgende Dinge nochmal näher eingehen:
Bimbo 3. schrieb:> 3. Timer als Dual-Slope PWM konfigurieren, welche Timer du dafür nimmst,> hängt davon ab, an welchen Pins deine LEDs angeschlossen sind. 8-Bit> Modus beim 16-Bit Timer wird wahrscheinlich reichen.
was bedeutet DUal-Slope und wie lege ich einen Timer fest? ich hab immer
nur was von Timer1 gelesen
Bimbo 3. schrieb:> 1. ADC Kanal 1 auswählen
- wie "wähle" ich den denn "aus" also mit welcher Funktion wird das
gemacht?
Bimbo 3. schrieb:> 2. AD-Wandlung starten
- wie starte ich die mit welcher Funktion?
Bimbo 3. schrieb:> 4. Ergebnis der Wandlung abholen und um 2 Bits kürzen (10 Bit auf 8 Bit)
- wie kürze ich das? einfach die Variable minus 2 rechnen?
Bimbo 3. schrieb:> 5. 8-Bit Ergebnis in das Compareregister des Timers für die 1. LED> schreiben
- auch bitte erläutern, kann mir darunter leider nix vorstellen :/
tut mir wirklich leid, mir fehlt da wirklich jegliches Verständnis fürs
Programmieren.. es fällt mir super schwer, mich da reinzuversetzen.
Danke jedenfalls! bis auf die Punkte habe ich alles, denke ich, gut
verstanden! das hat schon mal viel geholfen!!
Oha, da scheinen dir ja jegliche Grundlagen zu fehlen, das ist nichts
was ich mit 3 Sätzen aufklären könnte. Arbeite dich erstmal durch die
Tutorials, Link steht ja schon da.
Die Timer (Der ATmega328 hat 3 davon) sind wie z.B. der ADC Teile des
µControllers, welche auf dem Chip neben der eigentlichen ALU vorhanden
sind und teils unabhängig arbeiten. Bei allen µP die ich kenne ist es
so, dass solche Komponenten durch Konfigurationsregister eingestellt
werden und dann mehr oder weniger automatisch etwas tun. Das Ergebnis
kann man dann aus Statusregistern oder "Ergebnisregistern" auslesen.
Außerdem kann man auch Interrupts auslösen lassen, aber das vergiss
erstmal wieder.
Für den Timer0 musst du jetzt z.B. die Register TCCR0A und TCCR0B
(Timer/Counter Control Register A/B) schreiben. Darin gibt es Bits die
bestimmen was der Timer/Counter tun soll. Also hoch oder runterzählen,
mit welchem Takt und ob daraus z.B. ein PWM-Signal generiert werden
soll. Welche Bits was machen Steht im Datenblatt des ATmega328 auf S.
105 und folgende.
Hier mal eine init-Funktion es einem meiner Programme (Ist für einen
ATmega2560) bei der ich mehrere Timer konfiguriere, nur das du mal
siehst wie das aussehen kann. Zu meiner Schande habe ich hier binäre
Zahlen in die Register geschrieben, sodass man zwangsläufig ins
Datenblatt schauen muss um die Bedeutung zu erkennen.
1
// This function initializes the timers TC1 & TC4 for 25.000 kHz PWM.
2
// TC2 to an other PWM frequency (>20 kHz), TC5 for period measuring and TC 3 for tick generation
3
voidtimer_init()
4
{
5
// Three timers for PWM generation.
6
TCCR1A=0b10101000;// clear up, set down, phase and frequency correct PWM
7
ICR1=(320-1);// 16MHz / (2*320) = 25kHz
8
// maximum is 319 so 0 - 319 are allowed values
9
TCCR1B=0b00010001;// WGM: 8, 16 MHz
10
11
12
TCCR4A=0b10101000;// clear up, set down, phase and frequency correct PWM
13
ICR4=(320-1);// 16MHz / (2*320) = 25kHz
14
// maximum is 319 so 0 - 319 are allowed values
15
TCCR4B=0b00010001;// WGM: 8, 16 MHz
16
17
18
TCCR2A=0b10100001;// clear up, set down, phase correct PWM
19
// 16MHz / (2*256) = 31.25kHz
20
// maximum is 255 so 0 - 255 are allowed values
21
TCCR2B=0b00000001;// WGM: 8, 16 MHz
22
23
24
25
// TC5 for period measuring
26
TCCR5A=0b00000000;// no output compare WGM: normal
Guten Tag, Max hier
danke erstmal für den hilfreichen Text! Ich hoffe, dass es mir
weiterhilft!
So ganz eine Vorstellung was ich dann im finalen Source Code schreiben
soll habe ich aber dennoch nicht.
Ich verstehe aber zumindest, was dort geschehen soll.
Ich könnte jetzt sogar einige Codes schicken, von denen ich aber den
richtigen Effekt nicht wirklich kenne. Vielleicht kannst du/ könnt ihr
mir ja dann einiges zum Verständnis erläutern!
MfG Max :)
Hallo Maxx,
> Ich könnte jetzt sogar einige Codes schicken, von denen ich aber den> richtigen Effekt nicht wirklich kenne. Vielleicht kannst du/ könnt ihr> mir ja dann einiges zum Verständnis erläutern!
Du erzählst uns jetzt seit zwei Tagen das du das alles nicht verstehst,
zeigst aber nicht was du nicht verstehst. Wie soll man dir da helfen?
Zeige endlich mal was du an Quellcodes hast und was du daran nicht
verstehst.
rhf
Hallo Maxx,
Mit welcher Proragmmiersprache arbeitet ihr? Der erst Quellcode ist in
Basic (vermutlich BASCOM), die unteren Quellcodes sind in C geschrieben.
> und eine dazugehörige main.c, die ein Studienkollege erstellt hat:
Das sind aber 2 verschiedene main()-Routinen: einmal der Klassiker zum
LED-Blinken und unten die main()-Routine für die PWM-Geschichte. Aber
egal, was verstehst du nicht?
rhf
Hey Roland!
Wir arbeiten mit C in AVR Studio 4
und da ich mich damit nicht auskenne wusste ich auch nicht, dass der
erste nicht in C geschrieben war, entschuldigung.
Naja ich verstehe einfach die einzelnen Funktionen nicht, was diese
bewirken und wie sie das tun.
ich verstehe die Variablendeklarationen
uint8_t keystate = 0;
uint8_t str[50];
uint8_t str2[50];
uint8_t instr[16];
uint8_t dutyled = 50;
uint8_t c;
das danach sind sicherlich aufgerufene Funktionen aus den zugehörigen
Header-Dateien
die while Schleife ist dann schon schwieriger, die versteh ich nicht so
wirklich.
soll ich die dazugehörigen header mal reinstellen?
bringt dieser code meinem Projekt überhaupt etwas?
danke für die Hilfe :)
Hallo Maxx,
> Wir arbeiten mit C in AVR Studio 4> und da ich mich damit nicht auskenne wusste ich auch nicht, dass der> erste nicht in C geschrieben war, entschuldigung.
Du brauchst dich nicht zu entschuldigen. Allerdings hat es keinen Zweck
mit dir den Code durch zusprechen, wenn du den Unterschied zwischen
BASIC und C nicht erkennst. Dein Problem ist das du noch nicht mal die
absoluten Grundlagen verstanden hast und darüber hinaus offensichtlich
auch dein Werkzeug nicht bedienen kannst. Nicht schlimm, das kann man
alles lernen.
Ein Forum wie dieses hier kann dir dabei aber nur wenig helfen, weil die
Kommunikation viel zu umständlich und zeitraubend ist. Ich pflichte
einem anderen Diskussionsteilnehmer bei und rate dir jemanden zu suchen,
der mit dir zusammen mal ein paar Grundlagen und Beispiele durch geht.
rhf
Hey Roland,
ich hab den Unterschied mittlerweile erkannt.
und einige Grundlagen beherrsche ich auch.
Ich hab den ersten Quelltext nur überflogen und da sah er ähnlich aus.
Jetzt wo ich ihn näher betrachtet habe, erkenne ich aus.
Dennoch weiß ich nicht mal, wie ich bei meinem Projekt anfangen soll...
ich finde, dass das Forum mir aber trotzdem viel weitergeholfen hat!Ich
hab' dadurch bereits eine viel größere Vorstellung davon, wie ich mein
Projekt zu gestalten habe.
Also vielleicht kannst du mir ja mal sagen, welche Funktionen ich
brauche, um mein Projekt so zu realisieren, wie ich muss?
Vielleicht auch mit kurzer Beschreibung?
Der gute Bimbo385 hat mir ja schon geholfen, einen groben Aufbau des
Programms zu haben.
Hallo Maxx,
> Dennoch weiß ich nicht mal, wie ich bei meinem Projekt anfangen soll...
Ja, das merkt man.
Du musst dich zuerst mit der Programmiersprache vertraut machen. Vorher
brauchst du mit deinem Projekt gar nicht anfangen. Kauf dir ein Buch zu
C, installiere dir ein C-Entwicklungssystem, was einfaches wie z.B. LCC:
http://www.cs.virginia.edu/~lcc-win32/
und programmiere die Beispiel im Lehrbuch nach. Das hört sich jetzt erst
mal nach viel Vorarbeit an und das ist es auch. Aber es führt kein Weg
daran vorbei.
Erst wenn du in C eine gewisse Sicherheit erlangt hast, solltest du mit
dem einfachsten Beispiel auf dem AVR-Kontroler beginnen (das ist das
LED-Blink-Programm deiner ersten main()-Funktion). Wenn das läuft, weißt
du das deine AVR-Entwicklungsumgebung (also AVR Studio 4) funktioniert.
> Also vielleicht kannst du mir ja mal sagen, welche Funktionen ich> brauche, um mein Projekt so zu realisieren, wie ich muss?
Du musst deine Aufgabe in ganz einfache Teilaufgaben zerlegen:
Als erstes würde ich ein Programm schreiben, das mittels des AD-Wandlers
einen Potentiometerwert einliest und z.B. über die serielle
Schnittstelle (UART) ausgibt (damit man sieht ob die Werte plausibel
sind). Das erweiterst du dann so, das 3 Potis ausgelesen und angezeigt
werden.
Dann würde ich eine Funktion schreiben, die ein PWM-Signal ausgibt und
mit diesem Signal erst mal nur eine einfache LED ansteuern. Funktioniert
das, erweiterst du das auf 3 LEDs, so das du dann mit deinen 3 Potis (je
eins für R, G und B) diese 3 LEDs in der Helligkeit steuern kannst.
Eine ganz wichtige Hilfe ist
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
und
https://www.mikrocontroller.net/articles/AVR-Tutorial
Da steht im Prinzip (ADC-, UART- und PWM-Programmierung) alles drin, was
du zum Lösen deiner Aufgabe wissen musst.
rhf
Moin Maxx, bin wieder da, musste mal ein bisschen Rennauto fahren die
letzten Tage ;-)
Also wenn ich dich dich richtig verstehe fehlen dir schon die Grundlagen
zur C-Programmierung (while-Schleife). Die Programmiersprache C ist
grundsätzlich erstmal unabhängig von dem zu programmierendem System/µC.
Du solltest eigentlich wenn du im Studium an so einem Projekt sitzt,
vorher irgendeine Grundlagenvorlesung C-Programmierung gehabt haben, in
der so Sachen wie Schleifen, Deklarationen, Funktionen,
Typendefinitionen, Strukturen, Arrays und Pointer usw. erklärt werden.
Ich gebe gerne zu, dass auch ich nicht jede Syntax immer im Kopf habe
und ich hier und da noch mal nachschlagen muss. Aber du solltest das
alles zumindest schon mal gehört und auch verstanden haben.
Man kann sich natürlich C auch beim µC Programmieren beibringen.
Einfacher geht es aber erstmal die Sprache auf einem normalen Computer
zu lernen, auf dem man dann auch die Standardausgabe printf usw. einfach
benutzen kann, einfache Möglichkeiten zum Debuggen hat und sich auch
keine Gedanken über Speicher und Performance machen muss. Ein aktuelles
Notebook/PC hat davon einfach genug (zumindest für das was wir jetzt
machen wollen).
Ich persönlich benutze zum Testen von Programmschnipseln und Algorithmen
gerne den Onlineservice von
https://www.tutorialspoint.com/compile_c_online.php dort kann man
einfach loslegen und der verwendete GCC Compiler ist dem AVR-GCC auch
ziemlich ähnlich.
Wenn du mit C soweit vertraut bist, solltest du mit dem bereits
verlinkten AVR-Tutorial weitermachen. Dann sollte mit den bereits
gegebenen Tipps der Rest relativ einfach sein.
Frohes Schaffen,
Bimbo385