30 Channel PWM mit ATMEGA32

Gast #2724567
Lesenswert?

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
Angehängte Dateien:
Gast #2724635
Lesenswert?

@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
#2724636
Lesenswert?

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.
#2724659
Lesenswert?

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.
Gast #2724664
Lesenswert?

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
#2724672
Lesenswert?

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.
Gast #2730672
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren