Forum: Mikrocontroller und Digitale Elektronik Attiny2313 - Problem mit PWM


von Dextrose (Gast)


Lesenswert?

Gute Tag. Ich verwende einen Attiny2313 um die Helligkeit dreier LEDs zu 
steuern. Dazu benutze ich 3 PWM Kanäle.
Nun bin ich auf ein Problem gestoßen, bei dem ich nicht weiter komme.
Ich gehe davon aus, dass mein Programm in Ordnung ist, denn auf dem 
STK500 klappt alles ohne Probleme. Jeder Kanal lässt sich individuell 
einstellen.

Das ganze habe ich jetzt auf Lochraster übertragen und ein Kanal macht 
Probleme. Habe ich alle drei Kanäle angeschlossen, so ist es immer der 
OC0B Pin (PD5) der nicht richtig funktionieren will. Ich habe ihn mal 
zur Seite gebogen, so dass er keine Kontakt mir dem Sockel hatte und mit 
eine Oszilloskop nachgemessen. Es tut sich nichts an dem Pin. Ich denke, 
dass dieser Pin dann die ganze Zeit hoch impedant ist. Gehe ich mit 
einem Schraubendreher dran so flackert die LED mit auffälligen 50Hz
Das kuriose ist nun, dass dieser PWM Kanal an PD5 bestens funktioniert, 
sobald ich einen anderen PWM Kanal weg biege. Wenn ,in meinem Fall: OC0A 
oder OC1A, keinen Kontakt zum Sockel/Platine haben, funktionieren die 
zwei PWM Kanäle die übrig geblieben sind wunderbar.

Ich habe schon alles mögliche nachgemessen. Die Eingänge der 
Mosfettreiber auf die die PWM Kanäle gehen haben alle keinen 
Kurzschluss. Die Treiber und die Mosfets funktionieren auch. Den Attiny 
habe ich testweise raus genommen und einen Arduino an die Pins 
angeschlossen. Alles funktionierte bestens, auf dem STK500 klappt auch 
alles ohne Probleme.

Die Beschaltung des Attinys sieht wie folgt aus: 4MHz Quarz mit 22pF 
Stützkondensatoren. 100nF Abblockkondensator. Die Spannung beträgt 5V
Die Beschaltung der Gatetreiber und der Mosfets: MCP1407 an 5V. 100nF 
Abblockkondensator. Die Beiden OUT Pins sind zusammengelötet und gehen 
auf das Gate des Mosfets (IRLU023N)

Wo könnte mein Problem liegen?

von Max D. (max_d)


Lesenswert?

Was passiert wenn du den Pin in Software als I/O auf (dauer-)high 
schaltest ?

von Thomas E. (thomase)


Lesenswert?

Dextrose schrieb:
> Die Beschaltung des Attinys sieht wie folgt aus: 4MHz Quarz mit 22pF
> Stützkondensatoren. 100nF Abblockkondensator. Die Spannung beträgt 5V
> Die Beschaltung der Gatetreiber und der Mosfets: MCP1407 an 5V. 100nF
> Abblockkondensator. Die Beiden OUT Pins sind zusammengelötet und gehen
> auf das Gate des Mosfets (IRLU023N)

Schaltungen beschreibt man nicht in Prosa. Zeichne einen Schaltplan.

mfg.

: Bearbeitet durch User
von Dextrose (Gast)


Angehängte Dateien:

Lesenswert?

Max D. schrieb:
> Was passiert wenn du den Pin in Software als I/O auf (dauer-)high
> schaltest ?

Habe in der Hauptschleife: ,,sbi PORTD, 5" eingefügt.
Wie zu erwarten bleibst der Pin die ganze zeit high.
Habe einen anderen AVR ausprobiert und das selbe Problem.

Hier ein Schaltplan, die anderen zwei Kanäle sind gleich aufgebaut.

Die Übertragung via UART habe ich mit einem Logicanalyzer getestet. Die 
Daten kommen alle über.

von Ich (Gast)


Lesenswert?

"T1: Timer/Counter1 External Counter Clock input is enabled by setting 
(one) the bits CS02 and CS01 in the Timer/Counter1 Control Register 
(TCCR1)"

Hast du evtl. da was gesetzt?

Dextrose schrieb:
> Ich gehe davon aus, dass mein Programm in Ordnung ist

Dein Code wäre auch nützlich um das beurteilen zu können ;)

von Dextrose (Gast)


Lesenswert?

Wenn es denn dann sein muss, bitteschön:
1
 .def temp0 = r16                             ; Definition eines Temporären Registers
2
 .def temp1 = r19
3
 .def temp2 = r20
4
 .def temp3 = r21
5
6
 .def data = r17                              ; Data Register, beinhaltet das zu sendende Byte.
7
 .def durchlauf = r18
8
 .def data_r = r10
9
 .def data_g = r11
10
 .def data_b = r12
11
12
 
13
 .equ baud = 9600                             ; Definiere die baud Rate (HC-05, Standart = 9600 baud)
14
 .equ f_cpu = 4000000                         ; Definiere die Taktfrequenz des Controllers
15
16
17
 .org 0x000                           
18
 rjmp main
19
20
 main:
21
 ldi temp0, 0xff
22
 out DDRB, temp0
23
 ldi temp0, (1<<PD5)
24
 out DDRD, temp0
25
26
27
 sei
28
29
 ;////////////////////////////////////////////// Stack Pointer setzen //////////////////////////////////////////////////////////////////////
30
 ldi temp0, (RAMEND)                          ; Lade die niedrigen 8 Bit der letzten Adresse des Rams in temp0
31
 out SPL, temp0                               ; Setze diese Adresse in die niedrigen 8 Bit des Stackpointers
32
 ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
33
34
35
36
 ;//////////////////////////////////////////////// Timer0 & PWM ////////////////////////////////////////////////////////////////////////////
37
 ldi temp0, (1<<COM0A1) | (1<<COM0B1) | (1<<WGM01) | (1<<WGM00)   ; COM0A1/B1 = 1 --> Die Pins OC0A/B sind nicht mehr vom PORT Abhängig.
38
                                                                  ; Ebenfalls wird OC0A/B = 0 gesetzt wenn der Timer OCR0A/B erreicht.
39
                                  ; Erreicht der Timer TOP (0xFF) dann wird OC0A/B = 1 gesetzt.
40
 out TCCR0A, temp0
41
 
42
 ldi temp0, (1<<CS00)                                             ; Vorteiler des Timer setzen.
43
 out TCCR0B, temp0
44
45
 ldi temp0, 0x00                                                  ; Setzen des Wertes ab wann OC0A = 0 sein soll.
46
 out OCR0A, temp0
47
 ldi temp1, 0x00
48
 out OCR0B, temp1                                                 ; Setzen des Werdes ab wann OC0B = 0 sein soll.
49
 ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
50
51
52
53
 ;//////////////////////////////////////////////// Timer1 & PWM ////////////////////////////////////////////////////////////////////////////
54
 ldi temp0, (1<<COM1A1) | (1<<WGM10)                              ; Siehe Timer 0
55
 out TCCR1A, temp0
56
 
57
 ldi temp0, (1<<CS10)
58
 out TCCR1B, temp0
59
60
 ldi temp0, 0x00
61
62
 out OCR1AL, temp0
63
 ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
64
 
65
66
67
68
 ;////////////////////////////////////////////////// Baud Rate setzen //////////////////////////////////////////////////////////////////////
69
 .equ UBRRV = ((f_cpu)/(16*baud))-1            ; Errechne den Wert für das UBRR Regsiter (baud Register), Formel aus Datenblatt!
70
 .equ baudR = (f_cpu/(16*UBRRV+1))             ; Errechne die Reelle baud Rate, Formel aus Datenblatt!                           ; 
71
72
 ldi temp0, HIGH(UBRRV)                        ; Lade die 8 höheren Bits des errechneten Wertes ins UBRR Register (UBRRH)
73
 out UBRRH, temp0
74
 ldi temp0, LOW(UBRRV)                         ; Lade die 8 niedrigen Bits des errechneten Wertes ins UBRR Register (UBRRL)
75
 out UBRRL, temp0
76
 ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
77
78
79
80
81
 ;////////////////////////////////////////////// Frame Format setzen ///////////////////////////////////////////////////////////////////////
82
 ldi temp0, (1<<UCSZ1) | (1<<UCSZ0)
83
                                                  ; UCSZ1 & UCSZ0 = 1, somit 8 Datenbits
84
 out UCSRC, temp0                                 ; Ausgabe der Werte ins UCSRC REgister (HC-05 Standart)
85
  ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
86
  
87
88
89
 ;////////////////////////////////////////////// Reciver Aktivieren ////////////////////////////////////////////////////////////////////////
90
 RX1:
91
 ldi temp0, (0<<TXEN) | (1<<RXEN)               ; Controller für's empfangen bereitstellen
92
 out UCSRB, temp0
93
 rjmp empfang0                                  ; Anschließen ind die Empfang schleife springen
94
 ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
95
96
97
98
 ;/////////////////////////////////////////////////// Empfang Schleife /////////////////////////////////////////////////////////////////////
99
 empfang0:
100
 ldi durchlauf, 0x09                            ; Anzahl der Durchläufe
101
 empfang1:
102
 sbis UCSRA, RXC                                ; Revieve Complete (RXC) Flag prüfen
103
 rjmp empfang1 
104
 empfang2:                                      ; Byte angekommen? Hier weitermachen!
105
 in data, UDR                                   ; RXC Flag Null: Lese die Daten aus UDR in "data" ein
106
 push data                                      ; Schiebe das Byte auf den RAM
107
 dec durchlauf                                  ; Reduziere die verbleibenden Durchläufe
108
 cpi durchlauf, 0x00                            ; Alle Bytes komplett? (=Anzahl der Durchläufe abgearbeitet)
109
 brne empfang1                                  ; Wenn Durchläufe abgearbeitet weiter. Sonst zurück zu empfang1 und warte auf die nächsten Bytes
110
 rjmp ausgabe                                   ; Alle Durchläufe abgearbeitet --> zur Ausgabe
111
 ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
112
113
114
 ;////////////////////////////////////////////////// Die Eingabe ausgeben //////////////////////////////////////////////////////////////////
115
 ausgabe:
116
117
 ;------------------------------------------------------ BLAU ------------------------------------------------------------------------------
118
 pop temp1                                     ;nn1   blau
119
 ldi temp0, 0b00001111
120
 and temp1, temp0
121
 
122
123
 pop temp3                                     ;n1n
124
 ldi temp0, 0b00001111
125
 and temp3, temp0
126
 mov temp2, temp3
127
 ldi temp0, 0x09
128
 bn1n_wtr0:
129
 add temp2, temp3
130
 dec temp0
131
 cpi temp0, 0x00
132
 breq bn1n_wtr_ende
133
 rjmp bn1n_wtr0
134
 bn1n_wtr_ende:
135
 
136
137
 pop temp3                                     ;1nn
138
 ldi temp0, 0b00001111                         
139
 and temp3, temp0                              ; Ausmaskierung der oberren 4 Bits da UTF-8 Kodierung
140
141
 cpi temp3, 0x00                               ; Eine 0?
142
 breq b1nn_wtr0
143
 cpi temp3, 0x01                               ; Eine 1?
144
 breq b1nn_wtr1
145
 cpi temp3, 0x02                               ; Eine 2?
146
 breq b1nn_wtr2
147
 
148
 b1nn_wtr0:                                    ; 0 --> 0
149
 ldi temp3, 0x00
150
 rjmp b1nn_wtr_end
151
 b1nn_wtr1:                                    ; 1 --> 100
152
 ldi temp3, 0x64
153
 rjmp b1nn_wtr_end
154
 b1nn_wtr2:                                    ; 2 --> 200
155
 ldi temp3, 0xC8
156
 rjmp b1nn_wtr_end
157
 b1nn_wtr_end:
158
 
159
 add temp1, temp2
160
 add temp1, temp3
161
 mov data_b ,temp1
162
 ;---------------------------------------------------- GRÜN --------------------------------------------------------------------------------
163
164
 pop temp1                                     ;nn1   grün
165
 ldi temp0, 0b00001111
166
 and temp1, temp0
167
 
168
 pop temp3                                     ;n1n
169
 ldi temp0, 0b00001111
170
 and temp3, temp0
171
 mov temp2, temp3
172
 ldi temp0, 0x09
173
 gn1n_wtr0:
174
 add temp2, temp3
175
 dec temp0
176
 cpi temp0, 0x00
177
 breq gn1n_wtr_ende
178
 rjmp gn1n_wtr0
179
 gn1n_wtr_ende:
180
181
 pop temp3                                     ;1nn
182
 ldi temp0, 0b00001111                         
183
 and temp3, temp0                              ; Ausmaskierung der oberren 4 Bits da UTF-8 Kodierung
184
185
 cpi temp3, 0x00                               ; Eine 0?
186
 breq g1nn_wtr0
187
 cpi temp3, 0x01                               ; Eine 1?
188
 breq g1nn_wtr1
189
 cpi temp3, 0x02                               ; Eine 2?
190
 breq g1nn_wtr2
191
 
192
 g1nn_wtr0:                                    ; 0 --> 0
193
 ldi temp3, 0x00
194
 rjmp g1nn_wtr_end
195
 g1nn_wtr1:                                    ; 1 --> 100
196
 ldi temp3, 0x64
197
 rjmp g1nn_wtr_end
198
 g1nn_wtr2:                                    ; 2 --> 200
199
 ldi temp3, 0xC8
200
 rjmp g1nn_wtr_end
201
 g1nn_wtr_end:
202
 
203
 add temp1, temp2
204
 add temp1, temp3
205
 mov data_g ,temp1
206
 ;------------------------------------------------------- ROT ------------------------------------------------------------------------------
207
208
 pop temp1                                     ;nn1   rot 
209
 ldi temp0, 0b00001111
210
 and temp1, temp0
211
 
212
 pop temp3                                     ;n1n
213
 ldi temp0, 0b00001111
214
 and temp3, temp0
215
 mov temp2, temp3
216
 ldi temp0, 0x09
217
 rn1n_wtr0:
218
 add temp2, temp3
219
 dec temp0
220
 cpi temp0, 0x00
221
 breq rn1n_wtr_ende
222
 rjmp rn1n_wtr0
223
 rn1n_wtr_ende:
224
225
 pop temp3                                     ;1nn
226
 ldi temp0, 0b00001111                         
227
 and temp3, temp0                              ; Ausmaskierung der oberren 4 Bits da UTF-8 Kodierung
228
229
 cpi temp3, 0x00                               ; Eine 0?
230
 breq r1nn_wtr0
231
 cpi temp3, 0x01                               ; Eine 1?
232
 breq r1nn_wtr1
233
 cpi temp3, 0x02                               ; Eine 2?
234
 breq r1nn_wtr2
235
 
236
 r1nn_wtr0:                                    ; 0 --> 0
237
 ldi temp3, 0x00
238
 rjmp r1nn_wtr_end
239
 r1nn_wtr1:                                    ; 1 --> 100
240
 ldi temp3, 0x64
241
 rjmp r1nn_wtr_end
242
 r1nn_wtr2:                                    ; 2 --> 200
243
 ldi temp3, 0xC8
244
 rjmp r1nn_wtr_end
245
 r1nn_wtr_end:
246
 
247
 add temp1, temp2
248
 add temp1, temp3
249
 mov data_r ,temp1
250
 ;------------------------------------------------------------------------------------------------------------------------------------------
251
252
253
 out OCR0A, data_r
254
 out OCR0B, data_g
255
 out OCR1AL, data_b
256
257
258
 rjmp empfang0                                  ; zurück zum empfang0 und auf Datenübertragung warten.
259
 ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

von Dextrose (Gast)


Lesenswert?

So, habe nun das Problem lösen können. Wie es aussieht habe ich die 
Spannung am AVR nicht genug geglättet, bzw. teilweise Spannungsabfälle 
(brown outs?). Das hat den Controller aus dem Konzept gebracht.
Nun habe ich genug Kondensatoren eingebaut, Elkos sowie Kerkos, und 
alles funktioniert super.

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.