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
#1
0
Aus gegebenem Anlass nochmal nach oben holen...

Ich suche jemanden, der mir bei der Programmierung eines Atmel Mikrocontrollers behilflich sein könnte.

Habe die Hardware für eine kleine Schaltung zusammen, hab aber nicht wirklich die Ahnung vom Programmieren.
Kann mir nicht vorstellen, dass das allzuviel Arbeit wäre.

MfG
Zitieren
#2
0
Puh ... ist schon ewig her, dass ich Mikrocontroller programmiert habe. Die Typen von Atmel kenne ich leider nicht. Benutzen die Assembler oder eine eigene Programmiersprache? Falls es so ein Ding mit Logikbausteinen ist (ähnlich Step7) kann ich vielleicht noch ein paar Tips geben (also allgemein bzw. eine "Lösung auf dem Papier" Wink). Bei spezialisierten Sachen oder höheren Programmiersprachen werde ich aber keine Hilfe sein Baby.
[Bild: cgb-signaturwdjiq.png]
Du hast eine (nicht mehr ganz so) geheime Botschaft entdeckt:
"Besucht Heinrich's Spiele-Ausstellung!" ;-)


Big Grin Big Grin
Zitieren
#3
0
Heinrich Reich schrieb:Benutzen die Assembler oder eine eigene Programmiersprache?

Assembler und C gehen auf jeden Fall.
Zitieren
#4
0
Hmm ... ich fürchte, da kann ich dir nicht wirklich helfen. Für eine Programmierung mit Assembler brauche ich das Teil direkt vor mir, weil ich dazu sehr viel ausprobieren muss. Und in Richtung C fehlt mir einfach das Wissen (ein "Hallo Welt" bekomme ich noch hin, aber ansonsten bin ich da eher "Scriptkiddie" Baby)
Aber wir haben hier doch bestimmt den einen oder anderen Experten, der sich damit auskennt (siehe jener Thread) Smile.
[Bild: cgb-signaturwdjiq.png]
Du hast eine (nicht mehr ganz so) geheime Botschaft entdeckt:
"Besucht Heinrich's Spiele-Ausstellung!" ;-)


Big Grin Big Grin
Zitieren
#5
0
Was muss denn überhaupt programmiert werden?
Zitieren
#6
0
1 Eingang - 2 Ausgänge

Am Eingang ist ein Taster angeschlossen (Active-High).

Wenn der Taster ~3 Sekunden lang gedrückt wird, schaltet Ausgang 1 auf High, Ausgang 2 soll Low bleiben.
Wird der Taster nochmal ~3 Sekunden lang gedrückt, schaltet Ausgang 1 auf Low, Ausgang 2 auf High.
Wird der Taster ein weiteres mal ~3 Sekunden gehalten schalten wieder beide Ausgänge auf Low.

Dann das ganze von vorne.
Bei einem Druck unter 3 Sekunden, soll an der Ausgängen nichts passieren.
Zitieren
#7
0
Etwas ähnliches habe ich mal für einen Kommilitonen gecoded, den Code habe ich noch. Mit minimalen änderungen sollte er auch das können was du willst.
Zitieren
#8
0
Sorry, dass ich erst jetzt antworte.
War jetzt paar Tage krank.

Der Code würde mich schon interessieren. Smile
Zitieren
#9
0
So ich hab es mal in ein git repo gepackt:
AVR Codes

Über die Schönheit und effizienz des Codes kann man sich streiten, musste in kürzester Zeit entstehen. Das ganze wurde für einen Atmel ATiny85 in C mit AVR Studio 7.0 geschrieben.

Aktuell reagiert es auf einfachen Tasterdruck und auf "gefühlte" 3s (war so der Wunsch des Design Studenten).

Die LED faded an und aus, wenn man den Taster kurz drückt, bis man ihn wieder drückt. Drückt man den Taster für längere Zeit, müsste die LED ein paar mal blinken und ausgehen. Zumindest müsste es so gewesen sein.

Eventuell hab ich irgendwann mal doch die Motivation und Lust das ganze mal sauber neu zu schreiben.
Zitieren
#10
0
Hab schonmal dank dafür.

Ich guck mal, ob ich den Code soweit anpassen kann.
Zitieren
#11
0
@ BSDBlack

Also ich komm leider gar net zurecht. Mir fehlen wohl einfach die Grundkenntnisse.

Würdest du mir eventuell etwas unter die Arme greifen?
Zitieren
#12
0
Das ist kein Problem. Kann dir gerne dabei unter die Arme greifen. Muss wie gesagt aber auch selber erstmal wieder in den Code reinkommen. Ich hab mir damals aus Zeitgründen das kommentieren gespart (ich bereue es gerade).
Zitieren
#13
0
So... dann nochmal von vorne.

Womit fang ich den am besten an? Eingänge, Ausgänge setzen.

Und dann mit dem ersten Tastendruck? Wie mach ich das am besten, dass der erst schaltet, wenn der Taster x Sekunden gehalten wurde?
Zitieren
#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
#15
0
So... ich komme eigentlich gar nicht klar im Moment.. Sad

Hab jetzt mal versucht, deine oberen Code Schnippsel zusammenzusetzen, nur um die LED mal leuchten zu lassen.

Da mein Taster aber im gedrückten Zustand 0 ist, und nicht 1 funktioniert das schonmal nicht?

Code:
#include <avr/io.h>

int main(void)

{
DDRB = 0x06; /* 0x06 Hex für Pb0 Eingang, Pb1+2 Ausgang*/    

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

while (1)
{
    PORTB = result;
}
}
Zitieren
#16
0
Hmm Entschuldige, hatte mich glaube ich unklar ausgedrückt..

das beides:

result = PINB & 0x01;
PORTB = result;

muss in die while Schleife. Da du sonst genau 1x liest und für immer den Zustand auf dem PORT ausgibst.

Soweit sollte es dann Codetechnisch passen. Bei anschließenden Fehlern die Schaltung prüfen, sind die LEDS richtig verschalten? ist der Taster richtig verschalten?
Zitieren
#17
0
Erstmal sorry. Hab atm schrecklich viel Stress, daher so unregelmäßig hier...

Also.. ich glaub ich sollte es aufgeben, es funktioniert gar nix mehr... Sad
Bekomme die LED noch netmal eingeschaltet...
Zitieren
#18
0
Ob du regelmäßig oder unregelmäßig hier bist sollte kein Problem sein ;D

du kannst ja mal wenn du Zeit hast deinen gesamten Code posten, dann kann man den mal durchgehen.
Zitieren
#19
0
So.. zum besseren Verständnis hab ich schonmal meinen Schaltplan hochgeladen, sollte dann einfacher zu reden sein...

[Bild: schematic2hs1k.png]
Zitieren
#20
0
Also, das Thema hier ist erstmal abgebrochen/pausiert. Finde atm einfach keine Zeit dafür.
Trotzdem danke für die Hilfe bisher.
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  [Info] 18 Monate Linux Mint- Ein Erfahrungsbericht marka 9 447 13.04.2024, 20:08
Letzter Beitrag: Topper_Harley
Question [Frage] Jemand Ahnung von der Unreal Engine 4? Juttar 9 4.866 27.09.2020, 00:01
Letzter Beitrag: Juttar
  [Frage] Automatische Bestätigung der UAC donald 14 6.124 08.09.2018, 16:46
Letzter Beitrag: Atreyu
  Robobackup - Ein Mini-Projekt Atreyu 0 2.531 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.715 14.12.2017, 18:30
Letzter Beitrag: tomwatayan

Gehe zu:


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