Hey liebe Community, Ich möchte gerne eine sehr einfach Ampelschaltung programmieren. Dabei soll bei rot PORTC 3 gesetzt sein, bei gelb PORTC 2 und bei grün PORTC 1. Außerdem soll wenn die Ampel wenn sie grün ist blinken und zwischen dem Wechseln ein delay von 1 sec. also 1000ms haben. Das ganze sollte dann in etwa wie im Gif aussehen.(https://gifyu.com/image/dr49) Leider habe ich nur das absolute Grundwissen weshalb es sehr nett wäre wenn mir einer von ihnen helfen könnte.
Ich denke, dass du dazu die Grundlagen der Mikrocontroller Programmierung lernen musst. Falls es um AVR geht: http://stefanfrings.de/mikrocontroller_buch/index.html Falls es um STM32 geht: http://stefanfrings.de/mikrocontroller_buch2/index.html Wir helfen Dir dann gerne bei konkreten Fragen. Dazu musst du aber deinen Schaltplan und das aktuelle Programm vorzeigen. Natürlich steht es Dir auch frei, jemand dafür zu bezahlen, die Arbeit für dich zu erledigen. Dann musst du das hier aber klar kommunizieren.
>das absolute Grundwissen
Aus was besteht das Grundwissen?
Auf welcher Hardware willst Du programmieren (lassen)?
Kannst Du löten?
Fragen über Fragen.
Wo sind die Antworten?
Das ganze ist rein theoretisch ich habe nicht vor irgendetwas zu löten... Ich kann etwas Java programmieren weswegen Schleifen, delay variablen usw. nichts neues für mich sind. Generell scheint ist die Aufgabe nicht sehr schwer nur verstehe ich nicht auf welche Werte ich PORTC jetzt genau setzen muss.
Matteo Benito schrieb: > Das ganze ist rein theoretisch ich habe nicht vor irgendetwas zu > löten... Trotzdem wirst du dich mit der Hardware auseinander setzen müssen. Praktisch sind Mikrocontroller - soetwas meinst du vermutlich, wenn du von PORTC sprichst vermutlich - verschieden. Mindestens die Mikrocontrollerfamilien unterscheiden sich deutlich voneinandern. Gemeinsam haben sie einige Grundprinzipien, aber wenn du dich sogar auf die Millisekunde genau mit der Zeit schon festgelegt hast, kommt es für die Umsetzung sogar auf die Taktfrequenz des Controllers an, auch theoretisch.
Rot = PortC3 = 2^3 = 8 Gelb = PortC2 = 2^2 = 4 Grün = PortC1 = 2^1 = 2 Einfach die Bitwerte der jeweils aktiven Farben addieren und die Summe auf PortC ausgeben. Zwischen die einzelnen Ampelphasen ein Delay-Aufruf mit der gewünschten Anzeige-Zeit.
Kann ich die Pins auch mit dezimal Werten setzten(in Codeblocks)? Hab das ganze jetzt mal so gemacht:
1 | #define F_CPU 3686400UL |
2 | #define ZEIT1 1000 |
3 | #define ZEIT2 400 |
4 | #include <avr/io.h> |
5 | #include <util/delay.h> |
6 | |
7 | int main(void) |
8 | { |
9 | DDRB = 0xFF; |
10 | PORTB = 0x03; |
11 | |
12 | // Insert code |
13 | |
14 | while(true) |
15 | { |
16 | PORTC = 3; //Ampel ist rot |
17 | _delay_ms(ZEIT1); |
18 | PORTC = 2; //Ampel ist gelb |
19 | _delay_ms(ZEIT1); |
20 | PORTC = 1; //Ampel ist grün |
21 | _delay_ms(ZEIT1); |
22 | for(int i =0; i<=4; i++) //Blinken(4mal) |
23 | { |
24 | PORTC = 1; |
25 | _delay_ms(ZEIT2); |
26 | } |
27 | PORTC = 2; //Ampel ist gelb |
28 | _delay_ms(ZEIT1); |
29 | } |
30 | return 0; |
31 | } |
Sicher kannst du auch Dezimalzahlen verwenden, aber nicht so, wie du geschrieben hast. Lerne den Zusammenhang zwischen IO Pins und Bits. Lerne, was Binärzahlen sind. Lerne, die man zwischen dem binären und dem dezimalen Zahlensystem umrechnet. Lerne, wie man einzelne Bits mit Operatoren setzt und löscht. Lerne, wie man mehrere Ausgänge gleichzeitig auf HIGH oder LOW schaltet, indem man Bit mit Operatoren kombiniert. All das ist in dem Tutorial erklärt, dass ich Dir oben empfohlen habe. Wenn diese Beiden Anganben wahr sind:
1 | PORTC = 2; //Ampel ist gelb |
2 | PORTC = 1; //Ampel ist grün |
Dann kann das nicht wahr sein:
1 | PORTC = 3; //Ampel ist rot |
Denn bei 3 würde die Ampel grün-gelb leuchten. Das hat was mit den Bits im Byte zu tun.
Ich würde die kleinste Zeiteinheit als Taktgeber nehmen (Blinkfrequenz) und die längeren Leuchtphasen einfach verlängern.
Matteo Benito schrieb: > Kann ich die Pins auch mit dezimal Werten setzten(in Codeblocks)? > Hab das ganze jetzt mal so gemacht: Warum sollte das funktionieren. Statt über Dezimalzahlen nachzudenken, solltest du dich besser mit Binärzahlen auseinander setzten. Sonst wird es nur unübersichtlich. Deine Portzuweisungen sind Mist, weil Rot 8 und nicht 3.
Stefan ⛄ F. schrieb: > In deiner Blink-Schleife musst du die LED auch mal aus schalten, > nicht > nur an. soll ich dann einfach PORTC = 0 setzen?
Matteo Benito schrieb: > soll ich dann einfach PORTC = 0 setzen? nur wenn du ALLES an Port C löschen willst, kann aber auch mal sein das was am Port C angeschlossen ist was nicht ausgehen darf, was wäre dann da zu tun?
Matteo Benito schrieb: > soll ich dann einfach PORTC = 0 setzen? Wenn die LEDs so angeschlossen sind, dass sie bei LOW Pegel aus sind, dann: Ja Ich habe nicht umsonst geschrieben, dass du deinen Schaltplan zeigen sollst.
Matteo Benito schrieb: > Das ganze ist rein theoretisch ich habe nicht vor irgendetwas zu > löten... Stefan ⛄ F. schrieb: > Ich habe nicht umsonst geschrieben, dass du deinen Schaltplan zeigen > sollst. den wird es wohl nie geben und wenn dann nur theoretisch!
Welchen AVR hast Du eigentlich genommen? Bei den größeren AVRs (ATMega32 z.B. und aufwärts) ist standardmäßig JTAG auf PortC aktiviert und belegt dort ein paar Pins. Wenn man die verwenden möchte, muß das erst abgeschaltet werden.
Matteo Benito schrieb: > DDRB = 0xFF; > PORTB = 0x03; Wenn du "theoretisch" Port C nutzen möchtest, musst natürlich nicht auch Port C als Ausgang konfigurieren. Und natürlicher kannst du auch gleich auf grün schalten. Vorausgesetzt du beginnst in Deiner Theorie bei 1 anstatt wie üblich bei 0. Dann hätest du nämlich direkt auf grün-gelb geschaltet.
Ben B. schrieb: > Welchen AVR hast Du eigentlich genommen? .... Matteo Benito schrieb: > Das ganze ist rein theoretisch ich habe nicht vor irgendetwas zu > löten...
1 | #include <avr/io.h> |
2 | #include <util/delay.h> |
3 | #define Zeit_1 4000
|
4 | #define Zeit_2 500
|
5 | #define Langeweile 1
|
6 | |
7 | //rot=B5
|
8 | //gelb=B2
|
9 | //grün=D7
|
10 | |
11 | int main(void){ |
12 | DDRD ^= 0b10000000; |
13 | DDRB ^= (1<<0b00000010) | ~(0b11011111); |
14 | while(Langeweile){ |
15 | PORTB |= 0x20; |
16 | _delay_ms(Zeit_1); |
17 | PORTB |= 4; |
18 | _delay_ms(Zeit_1); |
19 | PORTB &= ~(32 | 0b00000100); |
20 | PORTD |= (1<<7); |
21 | _delay_ms(Zeit_1); |
22 | for(int i=0; i<=7; i++) { |
23 | PORTD ^= 0x80; |
24 | _delay_ms(Zeit_2); |
25 | }
|
26 | PORTD &= ~(128); |
27 | PORTB |= (1<<2); |
28 | _delay_ms(Zeit_1); |
29 | PORTB &= (0<<2); |
30 | }
|
31 | return 0; |
32 | }
|
@theokrates Das hast du sicher nett gemeint, aber ich habe das Gefühl, dass der TO mit dieser Aufgabe etwas lernen soll. Die (fast) fertige Lösung vor zu sagen bringt ihm leider gar nichts bei.
Stefan ⛄ F. schrieb: > Die (fast) fertige Lösung vor zu sagen bringt ihm leider gar nichts bei. Ich glaube, er hatte mit dem Code ein anderes Ziel.
:
Bearbeitet durch User
Rolf M. schrieb: > Ich glaube, er hatte mit dem Code ein andere Ziel. Wäre schön, wenn sich der TO mal dazu äußert.
Stefan ⛄ F. schrieb: > Rolf M. schrieb: >> Ich glaube, er hatte mit dem Code ein andere Ziel. > > Wäre schön, wenn sich der TO mal dazu äußert. Hausaufgabe, was sonst?
Andreas B. schrieb: > Hausaufgabe, was sonst? wenn wir im Netz Hausaufgaben für andere lösen fällt das irgendwann auf uns zurück, wenn wir mal Spezialisten mit Gesellenbrief oder Diplom brauchen, die sind dann nichts mehr wert!
Joachim B. schrieb: > ällt das irgendwann auf uns zurück Freue dich schon einmal auf dein nächstes Auto. Ich habe beschlossen, meine alte Kiste so lange zu reparieren, bis es nicht mehr geht.
Stefan ⛄ F. schrieb: > Freue dich schon einmal auf dein nächstes Auto. weiss ich doch, musste ich schon beim letzten Auto feststellen, es wurden solange teure Teile auf meine Kosten getauscht bis ich beim Motorsteuergerät streikte, 2k€. dann doch lieber einen neuen Gebrauchten. Stefan ⛄ F. schrieb: > Ich habe beschlossen, meine alte Kiste so lange zu reparieren, bis es > nicht mehr geht. Dito, letztens wenigstens den Fernschalter im Lenkrad fürs Radio, da kam ich noch hin, war aber auch eine Schweinerei, erst mini Torx Schraubendreher kaufen, sich dann verrenken und dann zwischen 2 Ersatzteile wählen, eines zu 30€ gekauft, eines zu 90€ ignoriert. Das 30€ Teil hatte rote LEDs, das 90€ Teil blaue LEDs, OK die hätte ich ja noch umlöten können, aber die R Matrix für die Funktionen war auf dem PCB anders verschaltet, klappte also nicht, der Reinigungsversuch vorher mit ISO, Spüli klappte auch nicht, aber das Polieren der Goldkontakte mit trockenem Q-Tipp auf dem PCB klappte dann! 30€ für den Müll, aber immerhin 60€ gespart, abzüglich Torx Schraubendreher.
Beitrag #6203394 wurde von einem Moderator gelöscht.
Beitrag #6203414 wurde von einem Moderator gelöscht.
Beitrag #6203562 wurde von einem Moderator gelöscht.
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.