Hallo, ich habe hier schonmal Fragen bezüglich der Hardware zu meiner ersten Mikrcontroller-Bastelei gestellt und hätte jetzt noch eine zur Programmierung. Vlt gibt es ja den ein oder anderen, der die Nerven hat mir weiter zu helfen :D Hoffe ich bin in der richtigen Abteilung des Forums unterwegs hier! Ich will eigentlich nichts machen, als eine große Endlosschleife aufzubauen, in der ich per "if" Schleifen über die als Eingang parametrierten Pins entsprechende andere Pins als Ausgang ein- oder ausschalte. Also in diesem kleinen Experiment im Anhang möchte ich aus Adressregisterbereich B der Pins des Mikrocontroller den Pin08 in der Variablen Blinker_rechts ablegen. Wenn eine "0" statt einer "1" am Pin anliegt soll die Variable die If-Schleife anstoßen und den Ausgang des Bereichs "D" zum Blinken bringen. Vlt geht das ja so :D Ich wollte das kleine Programm in der Simulation laufen lassen, aber da kommen zwei Errors (unten im Bild). Ich habe schon ein bisschen gegoogelt und probiert, aber komme noch nicht dahinter was ich ändern muss, damit sie verschwinden. Weiß vlt jemand mehr dazu? Vielen Dank!
versuchs mal mit void *Blinker_rechts; und einer Auffrischung von "Zeigerarithmetik in C" Gruß, dasrotemopped.
Guck dir das mal an:
1 | #define F_CPU 1200000
|
2 | |
3 | #define Relais PB1
|
4 | #define SchalterOn PB2
|
5 | #define Eingang PINB
|
6 | #define AusgangB PORTB
|
7 | |
8 | #include <avr/io.h> |
9 | #include <util/delay.h> |
10 | |
11 | |
12 | |
13 | |
14 | int main(void) |
15 | {
|
16 | |
17 | |
18 | DDRB |= (1<<Relais); |
19 | DDRB &= ~ (1<<SchalterOn); |
20 | //PORTB |= (1<<SchalterOn);
|
21 | |
22 | while(1) |
23 | {
|
24 | if (Eingang & (1<<SchalterOn)) |
25 | |
26 | {
|
27 | AusgangB |= (1<<Relais); |
28 | _delay_ms(10000); |
29 | }
|
30 | |
31 | }
|
32 | return 0; |
33 | }
|
Das oben gebrachte Beispiel schaltet einfach nur ein Relais ein, wenn der ursprüngliche Schalter betätigt wird und sollte vergessen werden den Schalter wieder aus zu schalten, dann schaltet das Relais nach dem Delay ab. Das ist eine reale Schaltung, bzw. das Programm dafür. Kein Timer nötig, da es nur verhindern soll, dass die Batterie leer gezogen wird, wenn die magnetische Entriegelung vergessen wird manuell abzuschalten. Es ist sehr einfach, aber vielleicht verstehst du so wie Variablen einzusetzen sind.
Max F. schrieb: > Ich will eigentlich nichts machen, als eine große Endlosschleife > aufzubauen, in der ich per "if" Schleifen Offensichtlich ein Troll. void als Datentyp für eine Variable, "if-Schleifen", alles klar. If-Schleife alleine hätte auch ein Anfänger sein können. Aber auf void als Datentyp kommt kein Anfänger, das kann nur vergiftetes Trollfutter sein.
c-hater schrieb: > das kann nur vergiftetes Trollfutter > sein. Dann bin ich wohl drauf rein gefallen. :-(
Vielen Dank für alle "ernst gemeinten" Antworten! Ich kenne mich halt nicht damit aus, will mir aber das nötige Wissen aneignen, um das oben Beschriebene umzusetzen. Auf Void bin ich folgendermaßen gekommen: Ich kenne Siemens S7 ein bisschen und habe mir gedacht es wäre gut Variablen anzulegen, um den Überblick zu wahren. Habe dann einfach mal Blinker_rechts in das Atmel Studio eingetippt, ein = dahinter gemacht und dann wurde ich gefragt, ob es eine globale oder eine lokale Variable werden soll. Ich hab mich für global entschieden, drauf geklickt und alles stand so fertig da... Ich wäre dankbar wenn nicht son Troll-Blödsinn geschrieben wird, ich habe weder lange Ohren, noch grünes Fell, noch die Lust sowas zu lesen. Vlt wäre If-Bedingung oder -Abfrage richtiger? Ich habe einfach mal das Sternchen davor geschrieben (void *Blinker_rechts;), wie "dasrotemopped" :P vorgeschlagen hat und das debuggen bzw. sie Simulation ließ sich schon ohne Error starten. Muss mir heute Abend aber erst nochmal genau ansehen wie diese zu bedienen ist. @foldi: Definierst du alle Variablen, in meinem Fall jeden Pin, einfach mit "define"? #define Relais PB1 heißt dann was genau? Steht das PB1 schon für die Zuordnung des Pins? Und dann noch: DDRB |= (1<<Relais); DDRB &= ~ (1<<SchalterOn); Was bedeuten die Pfeile? Ein Vergleich auf 1? Was machst du an der Stelle? Ich habe nach meiner Suche gefunden, dass man z.B. hiermit definiert was Ein- bzw. Ausgänge sind: DDRD=0b00010000; Entschuldigt meine Unwissenheit :D
Max F. schrieb: > @foldi: > Definierst du alle Variablen, in meinem Fall jeden Pin, einfach mit > "define"? > #define Relais PB1 heißt dann was genau? Steht das PB1 schon für die > Zuordnung des Pins? > > Und dann noch: > DDRB |= (1<<Relais); > DDRB &= ~ (1<<SchalterOn); > Was bedeuten die Pfeile? Ein Vergleich auf 1? > Was machst du an der Stelle? Ich habe nach meiner Suche gefunden, dass > man z.B. hiermit definiert was Ein- bzw. Ausgänge sind: DDRD=0b00010000; > > Entschuldigt meine Unwissenheit :D Wenn man ein Programm portierbar machen möchte, macht so etwas Sinn. Dann braucht man nur noch die Pins ändern, statt das ganze Programm. Kaufe dir dieses Buch: http://www.franzis.de/elektronik/simulation-computer/avr-mikrocontroller-kochbuch Es ist das beste Buch und da werden Fragen beantwortet noch bevor du sie dir selbst stellst. Dazu kommt hinzu, dass sie dort aktuelle µC benutzen und nicht mit dem ewig alten ATmega8 als Beispiel anfangen. Also auch den ATmega328, wie er auf vielen Arduinos ist. Dazu solltest du dir aber auch noch ein C-Buch kaufen. Sei mir nicht böse, aber auf deine Fragen jetzt einzugehen, bedeutete ich lese dir ein C-Buch vor. http://www.amazon.de/C-Programmieren-Anfang-Helmut-Erlenk%C3%B6tter/dp/3499600749 Das noch dazu und du verstehst alles in wenigen Tagen.
Vielen Dank für die Empfehlungen! Es wird wahrscheinlich das beste sein. Viele Grüße!
Anfangs ist das alles sehr schwer, aber wenn du täglich etwas Zeit dafür hast, dann kommen die Erkenntnisse im Quadrat.
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.
