Wenn r = 0, g = 0 und b > 0 ist, funktioniert das ganze Problemlos.
Wenn jetzt aber r = 0 g > 0 und b = 0 ist will das ganze Nicht mehr (
Das ... -= 1; um genauer zu sein).
Das Lustige ist, wenn ich den Code Debugge und die Zeile
Was gebnau funktioniert wann nicht mehr? Die Testausgabe oben ist
sinnlos, da deiner Aussage nach ja im nicht funktionierenden Fall r==0
ist.
Ansonsten erzeuten Assembler Code angucken. Welcher Compiler überhaupt,
welches Zielsystem?
Das ganze Programm ist ein bisschen zu lang.
Prozessor ist ATMega328p
Der Variablen Typ in dem Fall ist uint8_t, spricht Wertebereich von 0 -
255.
>;->>> schrieb:> konstant auf 0 >;->>>
Nein, bspw. auf 127 ;)
Die Definition von pulse_led ist ein Struct:
whatsmyname? schrieb:> Die Definition von pulse_led ist ein Struct:
Das ist nicht die ganze Wahrheit, oder warum greift du mit einem Array
Index darauf zu?
Du testest in deiner if-Abfrage immer r_last, g_last und
b_last.
Kann es sein, dass die Dinger im Fall von r = 0 g > 0 und b = 0 nicht
richtig aktualisiert werden, um !=0 in der If-Bedingung zu sein ???
whatsmyname? schrieb:> Das ganze Programm ist ein bisschen zu lang.
Schon wieder so ein "ich lasse es mir langsam aus der Nase ziehen"
Beitrag. Am Ende ist es wieder eine übersehene Zuweisung oder anderer
Fehler des Programmieres.
Also her mit dem vollständigen Code! Und zwar schnelle! :-)))
whatsmyname? schrieb:> pulse pulse_led[128];
Das sind schon 1,5kB RAM. Die Schüssel hat nur 2k, oder? Kann es sein,
dass du aus dem verfügbaren RAM rausläufst?
Claus M. schrieb:> Das sind schon 1,5kB RAM. Die Schüssel hat nur 2k, oder? Kann es sein,> dass du aus dem verfügbaren RAM rausläufst?
War nur ein bsp ;) wird mit 3 initialisiert
whatsmyname? schrieb:> War nur ein bsp ;) wird mit 3 initialisiert
Ui, ein Witzbold.
Andere nach Fehler suchen lassen und noch falsche Fährten legen...
Warum kann man das Beispiel nicht gleich so angeben,
wie es echt im Code ist. Kopfschüttel
Klaus schrieb:> Torsten C. schrieb:>> also um Compiler-Fehler auszuschließen?> DAS macht man als allerletztes. Gerade als Anfänger!
das ist doch Unsinn, als Anfänger erzeugt mal zu 99.9% den Fehler
selber. Die Optimierung anzuschalten, führt dann zu fragen warum delay
nicht stimmt.
@ThatsYourName
Ich habe wirklich keine Lust mich in Dein System und Deinen Code
einzuarbeiten, aber Du zeigst da 3 Zeilen, die praktisch unabhängig von
einander sind.
In diesem Falle gilt: Geht eine, gehen alle.
Wenn nicht gerade Deine Indizes (i) ausflippen, oder Du an anderer
Stelle zu großzügig mit dem Speicher umgegangen bist, müsste das Ganz
auch gehen.
Gibt Dein Compiler am Ende nicht eine Speicherbelegung aus?
Wenn das alles in Ordnung ist, liegt der Fehler an anderer Stelle.
Vlad Tepesch schrieb:> klingt nach einem typischen volatile-vergessen-Fehler.
glaube ich nicht. Bei diesen 3 Zeilen ist es egal on der wert in einem
Register zwischengespeichert wird oder nicht. Nach dem -=1 muss der Wert
um ein kleiner sein. Wenn er jetzt ein volatile verwendet dann kann eine
ISR den wert wieder um eins erhöhen. Ohne volatile kann das aber nicht
passieren.
Ist es auch nicht.
Das ganze wird aus einem Interrupt heraus aufgerufen.
Allerdings ist die ganze Interrupt Logik mit mehreren Tasks und
gleichzeitigm UART Handling etwas 'verquert' und die UART Auswert ist
komplett hinüber, so dass ich nicht ausschliessen möchte, dass er sich
mit dem UART Handling die Variablenwerte zerschiesst.
Da ist wieder mal die Annahme, dass wenn man in der UART einen read()
aufruft, dann kommt da irgendwie alles was die Gegenstelle schickt in
einem Rutsch daher.
Pustekuchen
1
voidupdate_serial(){
2
uart_rec="";
3
while(uart.available()){
4
uart_rec+=(char)uart.read();
5
}
6
}
7
8
voidevaluate_serial_input(){
9
10
Stringtmpstring0="";
11
uint8_tcnum=0;
12
13
if(uart_rec!=""){
14
// Detect ',' in received string
15
for(inti=0;i<uart_rec.length();i++){
16
char
17
if(',')cnum++;
18
}
19
20
....
eben das leidige Problem, dass Anfänger erst mal lernen müssen, was
eigentlich ein Protokoll ist und wozu es dient, bzw. wie man sowas
auswertet, das es unabdingbar ist, dass man mit der Gegenstelle eine
End-Of-Message Kennung vereinbart, die dann auch ausgewertet werden muss
und erst dann gilt eine Message als komplett übertragen, so dass man
nicht 'noch nicht übertragene' Daten als gültig ansieht und mit denen
arbeitet etc. etc.
Edit: Ich bin mir recht sicher, dass das eigentliche Problem irgendwo in
diesem Bereich passiert. Den ganzen UART/Protokoll Teil müsste man neu
machen. Das ist alles nicht tragfähig - und warum der UART Teil da in
der Timer-Interrupt-Task-Scheduling Sache mit drinn hängen muss, ist mir
auch nicht klar. Da würde ich erst mal ansetzen. Es gibt keinen Grund,
warum der UART Teil da so verquert in die Timer-Interrupt Logik mit
reingenommen werden muss. Die UART Abfrage bzw. Auswertung kann
wunderbar in der Hauptschleife loop() bleiben. Aber als allererstes muss
da mal ein die Übertragung steuerndes Protokoll mit einer Form der
Message-Endekennung her.