Forum: Mikrocontroller und Digitale Elektronik 30 Channel PWM mit ATMEGA32


von Parabol1337 (Gast)


Angehängte Dateien:

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

von Michael .. (bigneal)


Lesenswert?

WD aktiv?

von Parabol1337 (Gast)


Lesenswert?

das hab ich auch vermutet läuft der beim ATMEGA32 über FUSE?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Parabol1337 (Gast)


Lesenswert?

hmm, wenn ich jetzt 2 Interrups hätte, könnten die sich in die Quäre 
kommen, hab aber nur den UART interrupt =(

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Woher weißt du, dass du einen Restart hast?

von Parabol1337 (Gast)


Lesenswert?

du hast schon recht, das sie ziehmlich Brutal ist, hab  erstmal alles 
abgespeckt, in der Hoffnung das das Problem sich löst =(

von Parabol1337 (Gast)


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

von Karl H. (kbuchegg)


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.

von Parabol1337 (Gast)


Lesenswert?

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

von Parabol1337 (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Parabol1337 (Gast)


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

von Karl H. (kbuchegg)


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.

von RGB (Gast)


Lesenswert?

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...

von Gregor B. (Gast)


Lesenswert?

Vllt. Hardwarefehler auf Kanal 19, der die Versorgungsspannung 
einbrechen lässt?

von Parabol1337 (Gast)


Angehängte Dateien:

Lesenswert?

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

von Parabol1337 (Gast)


Lesenswert?

Achja die Ports des µC werden über ULN2803A verstärkt. und die LED´s mit 
12V betrieben

von Basti M. (counterfeiter)


Lesenswert?

Mach doch mal einen kleinen 47n Kondensator an den Reset Pin... 
vielleicht gibts ne Miniflanke wenn der Kanal daneben schaltet?!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Parabol1337 (Gast)


Lesenswert?

Das könnte es seind auf den channels sind ja schon gewisse frequenzen

von Parabol1337 (Gast)


Lesenswert?

Sooo da bin ich wieder,

@ Frank M. Herzlichen DANK!!!!

das war der Fehler.

Schöne Grüße

von Parabol1337 (Gast)


Lesenswert?

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 
=)

von Parabol1337 (Gast)


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

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
Noch kein Account? Hier anmelden.