Forum: Mikrocontroller und Digitale Elektronik UART schon wieder Defekt.


von Heiko J. (hyco-j)


Lesenswert?

Hi, ich dabei mir einen Midi Mixer mit 1-3 AtMega8 zu bauen.

Zu erst habe ich einfach dieses Beispiel benutzt:

http://www.wiesolator.de/index.php?area=Musik&topic=MIDI-Einstieg&stopic=MIDI%20und%20AVR

Das hat auch Funktioniert :-)

Dann habe ich das Progamm erweitert:
1
$regfile = "m8def.dat"                                      ' ATMEGA8
2
$crystal = 8000000                                          ' 8 MHz
3
$baud = 31250                                               ' MIDI-Baudrate (31,25kBit)
4
5
6
Config Adc = Single , Prescaler = Auto , Reference = Avcc
7
Start Adc
8
9
10
Taster Alias Pind
11
Taster1 Alias Pinb
12
13
14
  Ddrd = &B00000010                                         ' Output auf TXD (PD1) pin3
15
16
  Portd = &B11111101                                        ' Pull-Up für Taster
17
  Portb = &B11111111
18
19
20
21
  Dim Note As Byte
22
  Dim Velocity As Byte
23
  Dim Befehl As Byte
24
  Dim Wert As Word
25
  Dim Noteon As Byte
26
  Dim Noteoff As Byte
27
  Dim Controlchange As Byte
28
  Dim Keydown(8)as Byte                                       ' Tasten-Merker
29
  Dim Keydown1(8)as Byte
30
  Dim Fader(8) As Byte
31
  Dim Count As Byte                                         ' ADC Werte (Fader)
32
33
34
  Noteon = &H90                                             'channel 1
35
  Noteoff = &H80
36
  Controlchange = &HB0                                      'CC1
37
38
39
  Declare Sub Sendmidi(byval Befehl As Byte , Wert As Word)
40
41
42
43
44
  Do
45
    For Count = 0 To 7 Step 1
46
47
48
  'Tasterreihe Port D
49
50
    If Taster.count = 0 Then
51
      If Keydown(count + 1) = 1 Then
52
53
         Befehl = Noteon
54
         Velocity = &H7E                                    '0-7F
55
         Wert = Count + 1                                   'Note 1-8
56
         Shift Wert , Left , 8                              'Schieben  (Byte zu Word)
57
         Wert = Wert + Velocity
58
59
         If Count = 1 Then                                  'PD1 überspringen (UART)
60
         Else
61
            Call Sendmidi(befehl , Wert)
62
         End If
63
64
        Keydown(count + 1) = 0                              'Tasten merker
65
66
      End If
67
    Else
68
      If Keydown(count + 1) = 0 Then
69
70
         Befehl = Noteoff
71
         Velocity = &H00                                    '0-7F
72
         Wert = Count + 1                                   'Note 1-8
73
         Shift Wert , Left , 8                              'Schieben  (Byte zu Word)
74
         Wert = Wert + Velocity
75
76
         If Count = 1 Then                                  'PD1 überspringen (UART)
77
         Else
78
            Call Sendmidi(befehl , Wert)
79
         End If
80
81
        Keydown(count + 1) = 1                               'Tasten merker
82
83
      End If
84
    End If
85
86
87
    'Tasterreihe Port B
88
89
    If Taster1.count = 0 Then
90
      If Keydown1(count + 1) = 1 Then
91
         Befehl = Noteon
92
         Velocity = &H7E
93
         Wert = Count + 9                                   'Note 9-16
94
         Shift Wert , Left , 8
95
         Wert = Wert + Velocity
96
        Call Sendmidi(befehl , Wert)
97
        Keydown1(count + 1) = 0
98
      End If
99
    Else
100
      If Keydown1(count + 1) = 0 Then
101
          Befehl = Noteoff
102
         Velocity = &H00
103
         Wert = Count + 9
104
         Shift Wert , Left , 8
105
         Wert = Wert + Velocity
106
        Call Sendmidi(befehl , Wert)
107
        Keydown1(count + 1) = 1
108
      End If
109
    End If
110
111
112
    'Fader Port C
113
114
    If Fader(count + 1) <> Getadc(count) Then
115
         Befehl = Controlchange
116
         Velocity = Getadc(count)
117
         Shift Velocity , Right , 3
118
         Wert = Count + 8
119
         Shift Wert , Left , 8
120
         Wert = Wert + Velocity
121
         Call Sendmidi(befehl , Wert)
122
    End If
123
124
    Fader(count + 1) = Getadc(count)
125
126
    Next Count
127
128
129
  Loop
130
  End
131
132
Sub Sendmidi(byval Befehl As Byte , Wert As Word)
133
134
  Print Hex(befehl);
135
  Print Hex(wert);
136
137
138
  Waitms 20
139
140
End Sub

Nach dem ich es auf den Atmega geflasht habe bekomme ich keine Daten 
mehr aus dem uC auch nicht als ich das Beispiel wieder drauf geflasht 
hatte.

Natürlich habe ich auch die Fuses gebrannt.

Gut dachte ich da ist wohl was beim brennen was schief gelaufen, habe 
einen neuen Atmega genommen und wieder das Beispiel dauf geflasht dieses 
mal mit 8Mhz und die entsprechenden Fuses.

Und es lief wieder alles. :-)

Nun habe wieder mein Programm drauf geflasht und habe wieder das gleiche 
Problem ! :-(

Vieleicht kann mir einer von euch sagen was ich falsch mache.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Heiko J. schrieb:
> Nun habe wieder mein Programm drauf geflasht und habe wieder das gleiche
> Problem ! :-(
Und was passiert, wenn du auf die "defekten" uCs wieder das lauffähige 
Beispiel draufmachst?

von Heiko J. (hyco-j)


Lesenswert?

Nix ... es kommt kein signal aus dem UART !

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Heiko J. schrieb:
> Nix ... es kommt kein signal aus dem UART !
Wie stellst du das fest?

von Heiko J. (hyco-j)


Lesenswert?

Na am Oszi ... bekomme nur +5 Volt raus !... Ich gehe davon aus das 
etwas im Programm nicht stimmt ob wohl es komisch ist dass, ein Programm 
das UARD zerstören kann.
Muss auch das zu sagen das es mein erstes AVR Projekt ist.

In der Simulation passt alles !

von Glaskugel (Gast)


Lesenswert?

Heiko J. schrieb:
> Natürlich habe ich auch die Fuses gebrannt.

Dann ist dabei vielleicht etwas falsch gelaufen?

von Heiko J. (hyco-j)


Lesenswert?

Gebrannt habe ich die Fuses auf :

Low Fuse (0xCE)
1 1 0 0 1 1 1 0
High Fuse (0x99)
1 0 0 1 1 0 0 1
Lockbits (0xFF)
1 1 1 1 1 1 1 1

Bei beiden !

Auslesen klappt auch.

Das Brennprogramm zeigt auch keinen Fehler an ! Ich nutze das 
MyAVRworkpad.

von Werner B. (werner-b)


Lesenswert?

Da würde ich aber am Pegelwandler (zB MAX232) einen Fehler suchen.

von Heiko J. (hyco-j)


Angehängte Dateien:

Lesenswert?

Es ist kein Pegelwandler vorgesehen.

UART (Atmega TX)-----[240R]---[220R]----[6n167]----[240R]---- +5V
                                      |_[Diode]_|




Nun habe ich nach löschen des uC wieder Daten, allerdings werden nur die 
ersten 3 Bytes ausgegeben.

auch wenn ich das Programm verkleiner:


$regfile = "m8def.dat"                                      ' ATMEGA8
$crystal = 8000000                                          ' 1 MHz
$baud = 31250                                               ' 
MIDI-Baudrate (31,25kBit)

Taster Alias Pind.2

Dim Keydown As Byte                                         ' 
Tasten-Merker

Init:
  Ddrd.1 = 1                                                ' 
Sendeleitung auf Output
  Portd.2 = 1                                               ' internen 
Pull-Up aktivieren für Taster

Main:
   Do
      Print Chr(&B10010000);
      Print Chr(69);
      Print Chr(100);
^^bis hier hin wird alles gesendet, die Pause macht er aber nicht !
      Waitms 200

      Print Chr(&B10000000);
      Print Chr(69);
      Print Chr(0);

  Loop
End

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.