Forum: Mikrocontroller und Digitale Elektronik Ampelschaltung PORTC


von Matteo Benito (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Grundwissen (Gast)


Lesenswert?

>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?

von Matteo Benito (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Mario M. (thelonging)


Angehängte Dateien:

Lesenswert?

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.

von Matteo Benito (Gast)


Lesenswert?

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
}

von Stefan F. (Gast)


Lesenswert?

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.

von Verkehrspolizist (Gast)


Lesenswert?

Ich würde die kleinste Zeiteinheit als Taktgeber nehmen (Blinkfrequenz) 
und die längeren Leuchtphasen einfach verlängern.

von Wolfgang (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

In deiner Blink-Schleife musst du die LED auch mal aus schalten, nicht 
nur an.

von Matteo Benito (Gast)


Lesenswert?

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?

von Joachim B. (jar)


Lesenswert?

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?

von Stefan F. (Gast)


Lesenswert?

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.

von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

> PORTC = 3

von Joachim B. (jar)


Lesenswert?

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!

von theokrates (Gast)


Lesenswert?

Pläne sind fast immer theoretisch.
In diesem Fall eher hypothetisch.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

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.

von theokrates (Gast)


Lesenswert?

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.

von Teo D. (teoderix)


Lesenswert?

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...

von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

Ohne Löten.

von theokrates (Gast)


Lesenswert?

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
}

von Stefan F. (Gast)


Lesenswert?

@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.

von Rolf M. (rmagnus)


Lesenswert?

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
von Stefan F. (Gast)


Lesenswert?

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.

von Andreas B. (bitverdreher)


Lesenswert?

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?

von Joachim B. (jar)


Lesenswert?

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!

von Stefan F. (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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
Noch kein Account? Hier anmelden.