Willkommen im cgboard - classic games Forum! Deine gemütliche Retro Gaming Community. Besuche uns auch im Discord Chat.

[Suche] jemanden, der ein wenig Mikrocontroller programmieren kann
#14
0
Anfangen kannst du mit Input und Output in einem Zug. Wichig ist hier zu wissen, welche Sprache und welcher Controller. Ich gehe jetzt mal von normalen C mit Atmel Studio auf einem 8Bit AVR aus. Ich setzte auch mal Elektrotechnische Grundkenntnisse vorraus, aber du hast so wie es aussieht ja schon deine Schaltung, also sollte das kein Problem sein.

Je nachdem wieviel Erfahrung du mit C hast, musst du die nötigen Header includieren und brauchst die obligatorische main( void ) Funktion.

Ab da wird es Spannend. Wie setzt man die Input / Outputs?
Es gibt sogenannte "Richtungs Register" bei AVR als DDRx bezeichnet. Das x steht für den Port, da immer 8 pins in einem Port zusammengefasst werden. In diesem Richtungsregister steht jedes bit für einen Pin.
Beispiel:
0b00001001 bedeutet:
Pin 0 => Ausgang
Pin 1 => Eingang
Pin 2 => Eingang
Pin3 => Ausgang
usw.

Jetzt wollen wir deinen Taster an Pin 0 und deine LED an Pin 1 von Port A anschließen. Bei der LED das übliche HIGH Active (bei 5V leuchtet die LED), müssen wir in das Register 0b00000010 schreiben, da eine 1 an dem entsprechenden Pin für Ausgang und 0 für Eingang steht:

DDRA = 0x02; /* 0x02 Hex für 0b00000010 */

Jetzt ist schonmal die Richtung gesetzt.
Vorerst werden wir dafür sorgen, dass die LED leuchtet, sobald du den Taster drückst. dafür müssen wir den Zustand des PIN 0 am Port A lesen und an den PIN 1 am PORT A weiterleiten.
Hierfür gibt es wieder jeweils Register:

PINA zum lesen aller Eingänge an Port A (8 Pins, gibt uns somit einen 8 Bit Wert mit dem Zustand an den Eingängen)
PORTA zum schreiben aller Ausgänge an Port A (8 Pins schreibt somit einen 8 Bit Wert mit dem Zustand an den Ausgängen)

So, jetzt haben wir aber sowohl Eingänge als auch Ausgänge am Port A. Hierbei ist zu beachten, die Pins ide als Eingänge definiert werden, ignorieren das "PORTx" Register, während Pins die Ausgänge sind im "PINx" Register einen undefinierten Zustand haben.

Aber wir schreiben C, somit können wir genau 1 Bit des Ports lesen und genau 1 Bit am Port schreiben.

Um ein Bit vom Port über PIN zu erhalten, nutzen wir Binärverknüpfungen:

int result; /* Zwischenspeichern des wertes zur vereinfachung */
result = PINA & 0x01; /* 0x01 Hex für 0b00000001 */

Was machen wir hier? Wir sagen überall wo im PIN Register und in unserer Maske eine 1 steht, kann im Ergebnis eine 1 stehen. Somit, wenn am Pin der Taster gedrückt wurde, sind dort 5V, diese sind für den Controller eine 1, verknüpft mit der 1 in der Maske (die an der selben stelle steht) haben wir eine 1 in unserer int Variablen.

Jetzt wollen wir das ganze schreiben. Prinzipiell können wir die Ergebnis Variable direkt in das Port Register schreiben, da alle Eingänge eh ignoriert werden, falls dort was stehen sollte.

PORTA = result;

Jetzt haben wir schonmal dafür gesorgt, dass der Controller alles was reinkommt wieder rausgibt.
Das ganze würde aber nur 1x kurz nach dem Starten passieren. Damit das länger läuft, bauen wir das ganze in eine einfache Endlosschleife (meistens baut die Atmel Studio sogar ein).

while (1)
{
/* Unser Code von gerade eben */
}

Nachdem du aber jetzt möchtest, dass der Taster erst nach einer gewissen Zeit drücken das Licht einschaltet kann ich dir als einfachen Weg einen Zähler vorschlagen.

Hier gehst du einfach her und initalisierst eine Variable, die du mit dem permanenten drücken des Tasters inkrementierst, beim loslassen sofort nullst. Mögliches Beispiel (wird nicht lange genug brauchen):

int main( void )
{
char led_on = 0; /* wir brauchen nur 8 bit, char reicht somit */
char counter = 0;

DDRA = 0x02;

while ( 1 )
{
if(PINA & 0x01)
{
++counter;
if( 255 == counter )
{
if( !led_on )
{
led_on = 1;
}
if( led_on )
{
led_on = 0;
}
}
}
else
{
counter = 0;
}
}

return 0;
}


Was macht das Programm?
Im Prinzip liest es in einer Endlosschleife den Zustand vom Taster. Ist dieser Gedrückt, geht das Programm in die IF abfrage und erhöht den counter. Wenn der Taster losgelassen wird, wird dieser auf 0 zurückgesetzt. Damit nur das licht angeht, muss dieser solange gedrückt werden, bis der counter auf 255 kommt und somit geprüft wird ob die led an oder aus ist und entsprechend umgeschalten.
Einziges Problem bei dem Programm ist, dass wenn man den Taster permanent drückt, wird die LED an und aus gehen, da der counter öfter die 255 erreichen wird.

Ich hoffe das ganze passt so ersteinmal und war verständlich genug. Bei Fragen bin ich gerne da und beantworte diese.
Gute Informationsquellen die ich dir ans Herz legen kann, sind das Handbuch deines Controllers, da ist jedes Register erklärt. Und AVR GCC Tutorial - Mikrocontroller.net

Viele Grüße

EDIT: Ich sehe gerade, die Code formatierung für die ich mir so viel Mühe gab, ist weg... Jetzt ist es wirklich unlesbar....
Zitieren


Nachrichten in diesem Thema
jemanden, der ein wenig Mikrocontroller programmieren kann - von BSDBlack - 05.12.2017, 22:03

Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  [Info] 18 Monate Linux Mint- Ein Erfahrungsbericht marka 9 557 13.04.2024, 20:08
Letzter Beitrag: Topper_Harley
Question [Frage] Jemand Ahnung von der Unreal Engine 4? Juttar 9 4.926 27.09.2020, 00:01
Letzter Beitrag: Juttar
  [Frage] Automatische Bestätigung der UAC donald 14 6.213 08.09.2018, 16:46
Letzter Beitrag: Atreyu
  Robobackup - Ein Mini-Projekt Atreyu 0 2.548 10.04.2018, 20:40
Letzter Beitrag: Atreyu
  [Grafik] Bräuchte mal eine kleine Hilfe für ein Dekompression Algorithmus für ILBM Bild Dateien SagaraS 7 3.780 14.12.2017, 18:30
Letzter Beitrag: tomwatayan

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste