Hallo zusammen,
ich hab mich, nachdem ich auf arbeit was kleines mit PWM+LED Ansteuerung
machen musste mal im Internet schlau gemacht und dabei Ambi/MoMo-Lights
entdeckt.
Habe das für ne ganz gute Übung gehalten und mal angefangen das zusammen
zu tragen.
Mittlerweile existiert ein C++ Programm welches mir die Farbwerte aus
verschiedenen Bildschirm bereichen (gradientenmässig) ausrechnet und
eine Platine mit einem Atmega 8515 drauf, die theoretisch 4 RGB LEDs
ansprechen kann.
Dazu ein in BASCOM verfasster Code welcher mir aus dem über FT232RL
umgewandeltes RS232 Signal auf 12 Soft PWM Kanäle umparsed.
Da ich bis vor 3 Wochen noch absolute PWM/ATmega Jungfrau war und auch
keine Ahnung hatte wie C++ mit COM-ports oder Bildschirminhalten umgeht
war das ne ganz schöne Arbeit.
Nun wäre denn soweit alles zusammen was man braucht. Nur irgendwie finde
ich keine Refferenzen dazu WAS und WIE GENAU ich meine RGB werte rüber
schicken soll.
Die Funktion ist mir klar, nur der Inhalt der Bufferdatei schleierhaft.
Habe zur Zeit ein Chararray in dem ich aus einer Zahl wie 213 ein "byte"
mache, also "11010101" und dieses dann übertrage.
auf der Seite des Atmegas dann polle ich einzelne bytes. Der bisherige
Code etwa eine Kopie vom Code eines Kollegen der schon öfters mal was
mit Atmegas gemacht hat und sieht zur zeit etwa so aus:
1
I=Ischarwaiting()
2
IfI<>0Then
3
DisableInterrupts
4
5
'blue1
6
InputbinI
7
Rec=Chr(i)
8
InputbinI
9
Rec=Rec+Chr(i)
10
InputbinI
11
Rec=Rec+Chr(i)
12
13
[uswfürdieandernfarben]
14
15
InputbinI
16
IfI=13Then
17
A=Mid(rec,1,3)
18
Blue1=Val(a)
19
A=Mid(rec,4,3)
20
Green1=Val(a)
21
[...usw]
22
23
EndIf
24
EnableInterrupts
25
EndIf
Mein eigentliches Problem is jetz dass ich keine Ahnung habe was der
Atmega für Inputs erwartet, oder was ich in C++ für Outputs über den
Comport schicken kann so dass die beiden einander verstehen.
Wäre unheimlich dankbar weil ich irgendwo kurz vorm verzweifeln bin ;)
DerHalt
> Mein eigentliches Problem is jetz dass ich keine Ahnung habe was der> Atmega für Inputs erwartet, oder was ich in C++ für Outputs über den> Comport schicken kann so dass die beiden einander verstehen.
Hä wie jetzt, du sendes ein Byte vom PC und der AVR empfängst genau
dieses Byte.
danke für deine Antwort.
Habe in der Zeit bis jetz grad noch kurz ne eigene Itao geschrieben.
Der PC sendet jetz über USB ein 37byte langen Datenstrom
3Farben*4LED*3Zeichen + '\0' endbyte.
Der Atmega scheint sich aber immer noch zu schade sein mit den hübschen
Daten was anzufangen. Ich weiss ist vll bissl viel verlangt, aber ich
post hier ma den Bascom source code. Vll hat ja jemand ein bisschen Zeit
über, die er mir opfern würde :)
> Der PC sendet jetz über USB ein 37byte langen Datenstrom> 3Farben*4LED*3Zeichen + '\0' endbyte.
Warum machst du sowas ;-)
Von einem '\0' war nie die Rede. Ein ASCII-Zeichen Carrige Return CR 13
(dez.) muss da hin. das ist in C oder C++ ein '\r'
Ohne dieses Endezeichen wertet die BASCOM Routine den empfangenen Text
nicht aus.
hehe, sry, da war ich wohl noch zu sehr in c und hab das ganze als
char-array richtig abschliessen wollen ^^
selbst so zeigt sich der uC leider unbeeindruckt am Kopf kratz
Hast du es schon mal geschafft, irgendwas an den µC zu senden?
Nicht dass es in deinem Hardwareaufbau (Taktrate AVR, RX-TX Kreuzung),
dem Bascom Programm (der Eingangspuffer von nur 13 Zeichen bei 19200
Baud kommt mir knapp vor) oder in deinem C++ Programm hapert.
Ich würde zum Testen der Hardware ein ordinäres Terminalprogramm
benutzen und Handeingaben machen. Ideal ist z.B. das Bray-Terminal unter
Windows, bei dem man Texte auf Makrotasten legen kann.
http://www.mikrocontroller.net/articles/RS-232#Windows
Also das Empfangs-LED blinkt fröhlich im Gleichtakt mit den gesendeten
Daten. Müsste jetz nur noch rausfinden was der µC damit tut grins
achja, der Einganspuffer war noch falsch eingetragen. Mein Fehler. Wer
ma schaun was ich tun kann.
In dem Bascom-Programm ist keine Empfangs-LED eingerichtet.
Eine /analog spionierende LED/ an der seriellen Leitung zeigt nur, dass
was auf der Leitung ist, aber noch nicht, ob es von der Empfangs-UART
mit der richtigen Baudrate und ohne Frameerror erkannt wird.
ALso irgendwie kommt mir vor, du zäumst das Pferd
hier viel zu kompliziert auf.
BASCOM kann doch einen String empfangen
http://www.rowalt.de/mc/avr/avrboard/06/avrb06.htm
D.h. von der PC Seite aus schickst du dem AVR einen
String
"123,50,80\n"
(oder wieviele Zahlen es dann auch immer sein sollen,
auf BASCOM Seite wird dieser String auch als String empfangen,
danach die einzelnen Zahlen mittels MID und VAL rausgeholt
und verarbeitet.
habe ne Veranlagung zum Rückwärts aufzäumen.
Ich denke aber auch das die jetzige Situation eher so ist: Das Pferd ist
bereits rückwärts aufgezäumt und ich muss nur noch rausfinden wie man es
so rum reitet.
Das die LED nur anzeigt dass da überhaupt was ist, ist mir klar. Es ging
aber drum um zumindest mal sagen zu können was denn funktioniert. Und
das ist ganz klar der Weg "Porgramm->USB-Comport->RS232-Konverter mit
LED" :)
Hab mal Free Comport Monitor mitlaufen lassen. Mein Programm schickt
solche Datenpakete:
076076 usw wären dabei die invertierten Farbwerte (also 255-179=076).
Habe jetz versucht kurz ne Print Funktion reinzupacken damit ich auch
Rückmeldung oder so kriege. Leider tut sich in der Hinsicht gar nichts.
Ich frage mich schon ob der µC überhaupt programmiert ist. Benutze zum
ersten mal nen STK500 von nem Freund. Aber eigentlich krieg ich da
keinen Fehler von.
Wenn ich wneigstens wüsste wo der Fehler liegt dann könnt ich was tun.
Ahjo, Stack hab ich auf 37 erhöht damit ein ganzer input reinpasst und
hab noch gemerkt dass ich die baudraute vom Comport noch falsch
eingestellt hatte. ist jetz alles 19200.
Finde es einfach komisch dass der meine Print s ignoriert. Jemand nen
Vorschlag?
Schreib ein neues Bascom Programm, welches eine LED im Sekundentakt
blinken lässt. Warten kannst du mit DELAYY, WAIT oder WAITMS
Wenn das eine andere (8x langsamere) Blinkfrequenz hat, ist es
verdächtig und die Taktquelle und die AVR Fuses müssen gecheckt werden.
Guten Morgen Community
Hab in der Zwischnezeit mal meine Empfangsroutine in das vorgeschlagene
String-mit-Interrupt-füllen umgeändert. Muss jetz noch schauen ob ich
den Output von meinem C Progy entsprechend anpassen kann.
Die sende routine schickt ganz offensichtlich ja das richtige los, die
Empfangsroutine muss jetz nur noch das richtige damit anstellen ;)
Was den Debugger angeht. Hm, wie gesagt bin Neuling in der ganzen
Geschichte und ich denke nicht dass ich sowas habe(?)
Halte euch auf dem laufenden und bin immer für Tipps zu haben ;)
DerHalt
Schönen Montag Mprgen wünsche ich.
Ich denke ich habe das Problem soweit verfolgt dasses wohl irgendwo
Hardwaremäsig (erstmal) ist. Denn die LED auf dem STK500 leuchtet,
wärend die auf meinem eigenen auch bei einfachsten LED-blink/leucht
Anweisungen nicht reagiert. Die Seite PWM->LED funktioniert, denn
schalte ich das PWM-Signal einfach auf 5V hoch, leuchtet die Diode ohne
Probleme.
Müsste also irgendwo zwischen USB-Anschluss und AtMega irgendwas faul
sein.
Wäre euch sehr dankbar wenn ihr mal nen kurzen Blick hier drauf werfen
könntet.
Danke :)
DerHalt
> Was den Debugger angeht. Hm, wie gesagt bin Neuling in der ganzen> Geschichte und ich denke nicht dass ich sowas habe(?)
Dann wirds höchste Zeit dich darum zu kümmern. Helfen dabei kann ich dir
leider nicht, da ich keine AVRs verwende.
Werd mich ma umschaun ;)
Also war heute fleissig. Programm auf dem µC jetz soweit umgebaut dasses
mit nem viertel des Speicherplatzes endlich was kluges macht ;) (PWMs
und Inputs handlen).
Kann jetz per Terminal die Farben au frisch-fröhlich ändern. Nur scheint
ein unterschied zwischen dem Terminal und meiner Software zu bestehen,
denn diese bringt die Lichter entweder zum ausflippen oder zum
dauerleuchten :)
werd mich morgen nochmals dahinter hängen. Bin aber für jegliche
Vorschläge offen WARUM es nicht genau so klappt
PS: Terminal überträgt einfach 3x4 Zahlwerte (direkt als bytes) ohne
delay...mein Programm macht das selbe . keine endbytes oder so und auch
kein unterschied in baudrate.