Hallo Leute, ich habe da ein kleines Problem, habe mir eine 30 Kanal PWM mit ATMEGA32 gebaut, diese Redet mit dem PC über RS232. das klappt auch alles soweit, aber da ist irgentwo ein Bug drin. Wenn ich alle Kanale nacheinander ansteuer 1-30. Startet aus irgentwelchen gründen beim ansteuern von Kanal 19 der µC neu. Wenn ich aber von hinten anfange, also von 30-1 klappt es kann das der Watchdog sein? hab das Programm mal in den Anhang gepackt. vielleicht sieht ja jemand von euch wo es hängt. Danke schon mal Gruß Parabol
Fuse: ja ist aber unwahrscheinlich. Da du dich auch so nicht um den WD kümmerst, würde der in jedem Fall zuschlagen. WD ist es eher nicht.
hmm, wenn ich jetzt 2 Interrups hätte, könnten die sich in die Quäre kommen, hab aber nur den UART interrupt =(
Deine UART Auswertung ist ziemlich brutal. Du verlässt dich da darauf, dass da nichts durcheinander kommt. Trotzdem kann ich keinen Weg finden, wie du mit falschen Zeichen (zb einem \n) da out of bounds ins Channel Array schreiben kannst.
du hast schon recht, das sie ziehmlich Brutal ist, hab erstmal alles abgespeckt, in der Hoffnung das das Problem sich löst =(
@Karl Heinz Buchegger ich gehe da von aus! habe 3 Platinen davon; Channel 1-30, 31-60, 61-90 alle mit dem gleichen MAX232 verbunden, und beim ansteuern von Kanal 19 steigt die 1. Karte aus alle anderen bleiben an, ich kann aber ohne Manuellen Reset, die Kanäle wieder ansteuern, Das gleiche bei Kanal 49 und 79 hmmmm
Parabol1337 schrieb: > @Karl Heinz Buchegger ich gehe da von aus! > > habe 3 Platinen davon; Channel 1-30, 31-60, 61-90 alle mit dem gleichen > MAX232 verbunden, und beim ansteuern von Kanal 19 steigt die 1. Karte > aus Was heißt 'steigt aus'? reagiert sie nicht mehr, gehen alle LED aus oder voll an? Ich würd wenigstens auf das erste 'C' in deinem Protokoll synchronisieren. So als Minimalsicherung gegen Fremdzeichen.
Sorry für die ungenaue Angabe, Alles geht aus, kann aber daruf die Karte Per RS232 ansteuern und alle Kanäle einschalten bis zum Kanal 19
Karl Heinz Buchegger schrieb: > Ich würd wenigstens auf das erste 'C' in deinem Protokoll > synchronisieren. So als Minimalsicherung gegen Fremdzeichen. Ist normalerweise auch so, nur bei der Fehlersuche minimier ich das erstmal
So ungefähr (ungetesteter Code)
1 | ISR(USART_RXC_vect) |
2 | {
|
3 | static uint8_t receiveChannel = FALSE; |
4 | static uint8_t receiveValue = FALSE; |
5 | static uint8_t channelNr; |
6 | static uint8_t value; |
7 | |
8 | unsigned char nextChar; |
9 | |
10 | //Telegramm Strucktur : C000V000\r
|
11 | // Beispiel Channel 100 wert 240
|
12 | // C100V240\r
|
13 | |
14 | nextChar = UDR; |
15 | |
16 | if (nextChar == 'C') |
17 | {
|
18 | receiveChannel = TRUE; |
19 | receiveValue = FALSE; |
20 | channelNr = 0; |
21 | }
|
22 | |
23 | else if (nextChar = 'V') |
24 | {
|
25 | receiveChannel = FALSE; |
26 | receiveValue = TRUE; |
27 | value = 0; |
28 | }
|
29 | |
30 | else if( nextChar >= '0' && nextChar <= '9' ) |
31 | {
|
32 | if( receiveChannel ) |
33 | channelNr = 10 * channelNr + ( nextChar - '0' ); |
34 | else if( receiveValue ) |
35 | value = 10 * value + ( nextChar - '0' ); |
36 | }
|
37 | |
38 | else if( nextChar == '\r' ) |
39 | {
|
40 | if( receiveValue ) |
41 | {
|
42 | channelNr = channelNr - KANAL + 1; |
43 | if( channelNr >= 1 && channelNr <= 30 ) |
44 | channel[channelNr] = value; |
45 | }
|
46 | |
47 | receiveChannel = FALSE; |
48 | receiveValue = FALSE; |
49 | }
|
50 | }
|
Idealerweise würde noch eine Bestätigung zurückgeschickt, damit man sieht ob die Werte sauber angekommen sind.
Danke Für den Schönen Code, werde deinen Morgen gleich mal einbinden und testen. PS hatte eigentlich von niemanden verlerlangt mir den Code zuschreiben, aber trozdem herzlichen Dank. hab morgen Frühschicht Gute Nacht
Parabol1337 schrieb: > Danke Für den Schönen Code, Ist nur eine Idee. Wie gesagt: Ich kann deinen Code in Gedanken durchgehen so viel ich will, ich finde kein Schlupfloch, wie da Arrayindizes entstehen können, die ungültig sind. Du machst eine Plausibilitätsprüfung und IMHO müsste die alles abfangen. Auf der anderen Seite: Da ist ja auch sonst nichts im Programm, was einen Restart oder sonstigen Mist veranstalten könnte.
Karl Heinz Buchegger schrieb: > Auf der anderen Seite: Da ist ja auch sonst nichts im Programm, was > einen Restart oder sonstigen Mist veranstalten könnte. Wie wäre es dann mit einem Hardwarefehler? Zeig doch mal den Schaltplan deiner Platinen. Evtl. hast du ein Kanal 19 einen Designfehler und zwingst den ATmega in die Knie...
Vllt. Hardwarefehler auf Kanal 19, der die Versorgungsspannung einbrechen lässt?
Ein Layout Fehler würde ich aus schließen, denn alle 3 Platinen werden von der Gleichen 5V Spannungsquelle gespeißt Aber ist auch ne Idee
Mach doch mal einen kleinen 47n Kondensator an den Reset Pin... vielleicht gibts ne Miniflanke wenn der Kanal daneben schaltet?!
Parabol1337 schrieb: > Ein Layout Fehler würde ich aus schließen, denn alle 3 Platinen werden > von der Gleichen 5V Spannungsquelle gespeißt Da fehlen 100nF-Kondensatoren zwischen VCC und GND und AVCC und GND - ganz nah an den µC. Die müssen auf jeden Fall rein, sonst ist das Murks und Glücksspiel, ob es läuft oder nicht.
Das könnte es seind auf den channels sind ja schon gewisse frequenzen
Sooo da bin ich wieder, @ Frank M. Herzlichen DANK!!!! das war der Fehler. Schöne Grüße
Natürlich auch Danke an alle anderen die mir geholfen haben, Danke noch an Karl Heinz Buchegger für die schöne Uart, läuft perfekt =)
Hallo Ich bins noch mal, vielleicht kann mir wer noch einen kleinen Tip zur UART geben, wenn ich zu schnell dem controller daten sende hängt er sich einfach auf, heißt einige Känale bleiben an und sind nicht mehr änderbar, aber die anderen gehen einwandfrei, erst ein neustart des µC bringt abhilfe ich habe das grfühl der µC kommt nicht hinterher, wenn ich zwischen jedem Telegram 20ms pause machen klappt es einwandfrei Danke schon mal
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.