Forum: Mikrocontroller und Digitale Elektronik Probleme mit ATMEGA16


von Lars U. (lars_u)


Lesenswert?

Hallo,
ich habe heute meine Schaltung für meinen LED Cube fertig gebaut und 
binn auf ein paar Probleme gestoßen.

1. Ist 2,8 A zu viel für den µC ? (5V)
2. Ich habe ein Programm aus einem Forum drauf gespielt, seite dem kann 
ich ihn leider nicht mehr neu Programmieren da er den gesamten Strom vom 
Progger zieht (SMD LED auf dem Progger erlischt)
3. Mein µC wird heiß , kann das an 1. liegen ?

Leider habe ich die Vermutung das ich den µC gehimmelt habe.
Werde mir wohl mal ein anderes Programm raussuchen , vorallem eins für 
16MHz Crystal.

von Oliver (Gast)


Lesenswert?

1. Ja
2. ;)
3. Ja

Oliver

von Martin V. (oldmax)


Lesenswert?

Hallo Lars
Schön, das du eine Heizung gebaut hast. Wird ja jetzt bald Winter und da 
ist es ja nicht so verkehrt, etwas gegen die Kälte zu haben. Ein 
Elektroniker würde ja jetzt anfangen, nachzuschauen, wo der Strom 
entsteht und vielleicht mithilfe von Skizzen die Wege ergründen. Daher 
vermute ich mal, das du mal grade weißt, das Ampere das Maß für 
elektrischen Strom ist. Nun ja, das ist ja schon mal etwas. Kommen wir 
zum eigentlichen Kern deines Problems. Um eines mal klarzustellen, nur 
mit einem Programm bekommst du den Rauch aus dem Chip nicht raus. Also 
davon wird ihm nicht warm und schon gar nicht heiß. Also liegt es an 
deiner Hardware. Vielleicht hast du ja die Vorwiderstände vor den LED's 
weggelassen oder Hochstrom-LED's benutzt und keine Treiber dafür 
vorgesehen. 2,8 A ist ja schon ne Menge Strom...
Also, nicht verzagen, fleißig messen und weniger fragen und wenn fragen, 
dann bitte mit entsprechender Info. Also Schaltplan, vielleicht 
Programm, damit ausgeschlossen werden kann, das Ausgänge direkt 
kurzgeschlossen sind. Übrigends, wenn du einen Ausgang schnell von Low 
nach High hin und her schaltest, sollte da kein Kondensator 
angeschlossen sein. Je nach Kapazität wirkt das auch wie ein 
Kurzschluss.
Gruß oldmax

von Lars U. (lars_u)


Lesenswert?

Martin Vogel schrieb:
> Hallo Lars
> Schön, das du eine Heizung gebaut hast. Wird ja jetzt bald Winter und da
> ist es ja nicht so verkehrt, etwas gegen die Kälte zu haben. Ein
> Elektroniker würde ja jetzt anfangen, nachzuschauen, wo der Strom
> entsteht und vielleicht mithilfe von Skizzen die Wege ergründen. Daher
> vermute ich mal, das du mal grade weißt, das Ampere das Maß für
> elektrischen Strom ist. Nun ja, das ist ja schon mal etwas. Kommen wir
> zum eigentlichen Kern deines Problems. Um eines mal klarzustellen, nur
> mit einem Programm bekommst du den Rauch aus dem Chip nicht raus. Also
> davon wird ihm nicht warm und schon gar nicht heiß. Also liegt es an
> deiner Hardware. Vielleicht hast du ja die Vorwiderstände vor den LED's
> weggelassen oder Hochstrom-LED's benutzt und keine Treiber dafür
> vorgesehen. 2,8 A ist ja schon ne Menge Strom...
> Also, nicht verzagen, fleißig messen und weniger fragen und wenn fragen,
> dann bitte mit entsprechender Info. Also Schaltplan, vielleicht
> Programm, damit ausgeschlossen werden kann, das Ausgänge direkt
> kurzgeschlossen sind. Übrigends, wenn du einen Ausgang schnell von Low
> nach High hin und her schaltest, sollte da kein Kondensator
> angeschlossen sein. Je nach Kapazität wirkt das auch wie ein
> Kurzschluss.
> Gruß oldmax

Ich lerne vieles in der Schule und beherrsche ein wenig Grundwissen.
Mein problem ist auch dass, das Programm für ein 14,7xxxMHz Quarz ist.
Ich habe allerdings einen 16MHz.

Vorwiderstand ist bei jeder LED dabei, der Strom an PIN 10/11 und 30/31 
kommt auch richtig an, nur eben etwas zu groß (2,8A / 5V).

Ich werde mal einen anderen 7805 einsetzen um ca 1A zu haben.

Leider kann ich meinen ATMEGA16 nicht mehr neu programmieren da er wen 
ich ihn an den Progger anschließe , dieser keinen Strom mehr hat (Die 
LED auf ihm erlischt langsam). Habe eben schon 2 neue gekauft.


Die LED's haben auch alle den richtigen Widerstand un funktionieren 
einwandfrei auf meinem Breadboard.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Lars U. schrieb:
> Leider habe ich die Vermutung das ich den µC gehimmelt habe.

Ja.
Man nimmt ja auch zur Inbetriebnahme kein Netzteil, was 2,8A kann.
Vermutlich hast Du einen Schaltungsfehler, d.h. ein neuer MC wird auch 
sofort durchbrennen.

Der MC braucht max 20mA, d.h. ein Netzteil mit Strombegrenzung 100mA 
wäre richtig.
Erst wenn man die LEDs anklemmt, kann man die Strombegrenzung höher 
drehen.

von Martin V. (oldmax)


Lesenswert?

Hi
Schön, das du mich zittierst, aber mir scheint, ich muss da noch ein 
wenig nachhaken:
Mach von deiner Schaltung eine Skizze. Nicht deine Vorlage, sondern 
deinen Aufbau brauchen wir, wenn unsere Aussagen zutreffen sollen. Denn: 
Ein Programm treibt nicht den Strom hoch ! Auch die MHz sind nicht dein 
Problem, der Atmega16 kann durchaus 16 MHz.
So richtig versteh ich deine Beschreibung auch nicht: Der 7805 wird 
jetzt auf 1 A ausgelegt? Welcher hat denn die fast 3 A geleistet, ohne 
Schweißperlen zu bekommen? Bist du dir sicher, das der Controller 
wirklich nur die für ihn gesunden 5 V bekommen hat ? Du weißt, wer 
zuviel isst wird dick und Controller tun das manchmal auch, wenn die 
Versorgung zu üppig ist. Außerdem, wie hoch war der Strom zu den LED's ? 
Hast du da mal gemessen? Soweit ich das von hier aus beurteilen kann, 
ist nur ein Schaltungsfehler möglich, den Controller derart heiß zu 
machen.... ich tippe mal "Spannung zu hoch "
Gruß oldmax

von Lars U. (lars_u)


Lesenswert?

http://obrazki.elektroda.pl/5944479000_1337370257.png
Das ist die Schaltung, ich habe mir bei Conrad einen 7805 für 2A und 
einen für 1A gekauft , stimment tuht das aber nicht wirklich. Denn bei 
dem 1A bekomme ich nur 0.18 raus.

Die LED bekommen garkein saft , am µC ist ca 5.08V auf beiden seiten.

von Lars U. (lars_u)


Lesenswert?

Ich habe jetzt einen neuen µC mit eigenem Code und richtigem Crystal.
Leider wird er immernoch heiß, ich habe zur sicherheit die Knöpfe am µC 
abgelötet und alles andere überprüft. (Wusste nich wie man sie 
anschließt, konnte es nur aus anderen Schaltung deuten.

Heute werde ich mal versuchen an einen 7805 zu kommen bei dem ich 1A 
raus bekomme.

von Carsten R. (kaffeetante)


Lesenswert?

Aua.

Der Regler liefert nicht 1 A. Er liefert bis zu 1 A. Er liefert 5 V 
und der Verbraucher nimmt soviel er braucht. Der Verbraucher bestimmt 
den Strom! Erst wenn die 1 A überschritten werden oder der Regler zu 
heiß wird nimmt dieser Einfluß auf den Stromfluß. Dann geht aber auch 
die Spannung in die Knie. Es gibt Spannugsregler und es gibt 
Stromregler. Es gibt aber keine Regler die beides gleichzeitig Regeln, 
sondern höchstens begrenzen.

von Nicolas S. (Gast)


Lesenswert?

Lars U. schrieb:
> einen 7805 für 2A und
> einen für 1A gekauft , stimment tuht das aber nicht wirklich. Denn bei
> dem 1A bekomme ich nur 0.18 raus.

Hmmmm.....ich fürchte, nach der Bemerkung gibt es nichts mehr, was einen 
Shitstorm im Forum noch aufhalten könnte.

Mein Rat: Beschäftige Dich noch einmal mit den Grundlagen der 
Elektrotechnik und Elektronik. Mit Spannungen, Strom und Widerständen. 
Und mit LED-Vorwiderständen.

Und dann zieh den ATmega aus dem Sockel und such nach dem Fehler auf der 
Leiterplatte - ohne Betriebsspannung mit dem Durchgangsprüfer, mit 5V 
Betriebsspannung mit dem Voltmeter. Mach Dir vorher klar, welche 
Spannung an welchem Punkt laut Schaltplan sein sollte und miß nach. Wenn 
Du keinen Schaltplan hast ist es jetzt an der Zeit einen zu zeichnen. 
Das Fehlen eines Schaltplans gehört zu den Sachen, die eigentlich immer 
bereut werden.

Versuch anschließend die LEDs mit Drahtbrücken im Sockel einzeln zum 
leuchten zu bringen. Kurz: such den Fehler erst außerhalb des ATmegas, 
denn da wird mit Sicherheit einer sein. Vielleicht nicht ausschließlich. 
Aber da sein wird er - vermutlich ein Kurzschluß zwischen Leiterbahnen.

Viele Grüße
Nicolas

von Lars U. (lars_u)


Lesenswert?

Naja das mit dem Strom lag am Elko ...
Einen Schaltplan kann man in einem Post weiter oben sehen ...
Der Strom am eingang stimmt auch, er wird jetzt auch nicht mehr heiß.
Aber leider gibt er auf keinem Port strom, was er eigentlich tuen 
sollte.

: Bearbeitet durch User
von Freddy (Gast)


Lesenswert?

>...habe zur sicherheit die Knöpfe am µC abgelötet

Was für Knöpfe?

von Lars U. (lars_u)


Lesenswert?

Ich habe jetzt auch deinen Rat befolgt und es mit Kabelbrücken gemacht, 
funktioniert 1A.

http://obrazki.elektroda.pl/5944479000_1337370257.png
S1-4

von Dave C. (dave_chappelle)


Lesenswert?

Ja, das wundert mich kein bisschen.
Wie willst du ohne Treiber so viele LEDs betreiben?

Von Programmierung hast du wohl keine Ahnung (Hilfe Programm ist für 
14.xx Quarz, habe aber nur einen 16Mhz Quarz). Stell dir vor, das kann 
man einstellen.

Und Mein 5V/1A Regler bringt nur 0.18A.. Hm komisch was.
Mach doch mal den Versuch: Hänge einen 1Megaohm Widerstand deinen 5V 
Regler, wenn dann 1A fliesst hast du die Physik ausgehebelt mein Lieber!

Gruss

von Lars U. (lars_u)


Lesenswert?

Dave Chappelle schrieb:
> Von Programmierung hast du wohl keine Ahnung (Hilfe Programm ist für
> 14.xx Quarz, habe aber nur einen 16Mhz Quarz). Stell dir vor, das kann
> man einstellen.

Natürlich weiß ich das man das einstellen kann, allerdings hatte ich nur 
die HEX Datei ! Und habe eben alles nach dem Schaltplan oben gebaut.

>
> Und Mein 5V/1A Regler bringt nur 0.18A.. Hm komisch was.
> Mach doch mal den Versuch: Hänge einen 1Megaohm Widerstand deinen 5V
> Regler, wenn dann 1A fliesst hast du die Physik ausgehebelt mein Lieber!
>
> Gruss

Wusste ich nicht...

von Lars U. (lars_u)


Lesenswert?

Alles funktioniert soweit, allerdings gibt der µC auf keinem Port Strom.

Hier mal den code den ich benutze, hauptsächlich geht es mir aktuell um 
die bootmsg welche leider nicht funktioniert :
1
// ############################################
2
// 
3
// 4x4x4 LED Cube project
4
// By Christian Moen 2008
5
// chr@syntaks.org
6
// Lisence: GPL
7
//
8
// ############################################
9
10
#include <avr/io.h>
11
#include <avr/interrupt.h>
12
#include <avr/pgmspace.h>
13
14
// Define USART stuff
15
// CPU speed and baud rate:
16
#define FOSC 16000000
17
#define BAUD 9600
18
// Are used to calculate the correct USART timings
19
#define MYUBRR (((((FOSC * 10) / (16L * BAUD)) + 5) / 10) - 1)
20
21
22
// Define masks used for status LEDs and input buttons.
23
#define LED_GREEN 0x01
24
#define LED_RED 0x02
25
#define BUTTON 0x08
26
// Define port used for status and input.
27
#define LED_PORT PORTB
28
#define BUTTON_PORT PORTB
29
30
31
// Define masks for the layer select.
32
#define LAYER1 0x80
33
#define LAYER2 0x40
34
#define LAYER3 0x20
35
#define LAYER4 0x10
36
#define LAYERS 0xf0 // All layers
37
#define LAYERS_R 0x0f // The inverse of the above.
38
#define LAYER_PORT PORTD
39
40
// Define LED grid ports
41
// Each of the grid ports are connected to two rows of leds.
42
// The upper 4 bits is one row, the lower 4 bits are one row.
43
#define GRID1 PORTC
44
#define GRID2 PORTA
45
46
47
void ioinit (void); // initiate IO on the AVR
48
void bootmsg (void); // blink some leds to indicate boot or reboot
49
void delay_ms (uint16_t x); // delay function used throughout the program
50
void led_red(unsigned char state); // led on or off
51
void led_green(unsigned char state);
52
void launch_effect (int effect); // effect program launcher
53
54
// *** Cube buffer ***
55
// The 3D image displayed on the cube is buffered in a 2d array 'cube'.
56
// The 1st dimension in this array is the Z axis of the cube.
57
// The 2nd dimension of the array is the Y axis.
58
// Each byte is a stripe of leds running along the X axis at the given
59
// Z and Y coordinates.
60
// Only the 4 lower bits are used, since the cube is only 4x4x4.
61
// This buffer design was chosen to have code compatability with a 8x8x8 cube.
62
// "volatile" makes the variables reachable from within the interrupt functions
63
volatile unsigned char cube[4][4];
64
65
// We sometimes want to draw into a temporary buffer so we can modify it
66
// before writing it to the cube buffer.
67
// e.g. invert, flip, reverse the cube..
68
volatile unsigned char tmpcube[4][4];
69
70
// What layer the interrupt routine is currently showing.
71
volatile unsigned char current_layer;
72
73
// Low level geometric functions
74
#include "draw.c"
75
76
// Static animation data
77
#include "frames.c"
78
79
// Fancy animations to run on the cube
80
#include "effect.c"
81
82
83
int main (void)
84
{
85
  // Initiate IO ports and peripheral devices.
86
  ioinit();
87
  
88
  // Indicate that the device has just booted.
89
  bootmsg();
90
91
  int x;
92
  int i;
93
  int z;
94
95
  // Set the layer to start drawing at
96
  current_layer = 0x00;
97
  
98
  // Enable interrupts to start drawing the cube buffer.
99
  // When interrupts are enabled, ISR(TIMER2_COMP_vect)
100
  // will run on timed intervalls.
101
  sei();
102
103
  // Main program loop.
104
  while (1)
105
  {
106
    for (i=0;i<13;i++)
107
    {
108
      launch_effect(i);
109
    }
110
    // Comment the loop above and uncomment the line below
111
    // if you want the effects in random order (produced some bugs.. )
112
    //launch_effect(rand()%13);
113
  }
114
115
}
116
117
// Launches one of those fancy effects.
118
void launch_effect (int effect)
119
{
120
  switch (effect)
121
  {
122
    // Lights all the layers one by one
123
    case 0:
124
      loadbar(1000);
125
      break;
126
      
127
    // A pixel bouncing randomly around
128
    case 1:
129
      // blink
130
      boingboing(150,500,0x03,0x01);
131
      break;
132
    
133
    // Randomly fill the cube
134
    // Randomly empty the cube
135
    case 2:
136
      fill(0x00);
137
      random_filler(100,1,500,1);
138
      random_filler(100,1,500,0);
139
      break;
140
    
141
    // Send voxels randomly back and forth the Z axis
142
    case 3:
143
      sendvoxels_rand_z(150,500,2000);
144
      break;
145
      
146
    // Spinning spiral
147
    case 4:
148
      effect_spiral(1,75,1000);
149
      break;
150
    
151
    // A coordinate bounces randomly around the cube
152
    // For every position the status of that voxel is toggled.
153
    case 5:
154
      // toggle
155
      boingboing(150,500,0x03,0x02);
156
      break;
157
    
158
    // Random raindrops
159
    case 6:
160
      effect_rain(20,5000,3000,500);
161
      break;
162
    
163
    // A snake randomly bounce around the cube.
164
    case 7:
165
      // snake
166
      boingboing(150,500,0x03,0x03);
167
      break;
168
      
169
    // Spinning plane
170
    case 8:
171
      effect_spinning_plane(1,50,1000);
172
      break;
173
    
174
    // set x number of random voxels, delay, unset them.
175
    // x increases from 1 to 20 and back to 1.
176
    case 9:
177
      random_2();
178
      break;
179
    
180
    // Set all 64 voxels in a random order.
181
    // Unset all 64 voxels in a random order.
182
    case 10:
183
      random_filler2(200,1);
184
      delay_ms(2000);
185
      random_filler2(200,0);
186
      delay_ms(1000);
187
      break;
188
      
189
    // bounce a plane up and down all the directions.
190
    case 11:
191
      flyplane("z",1,1000);
192
      delay_ms(2000);
193
      flyplane("y",1,1000);
194
      delay_ms(2000);
195
      flyplane("x",1,1000);
196
      delay_ms(2000);
197
      flyplane("z",0,1000);
198
      delay_ms(2000);
199
      flyplane("y",0,1000);
200
      delay_ms(2000);
201
      flyplane("x",0,1000);
202
      delay_ms(2000);
203
      break;
204
      
205
    // Fade in and out at low framerate
206
    case 12:
207
      blinky2();
208
      break;
209
  }
210
}
211
212
// ** Diagnostic led functions **
213
214
// Set or unset the red LED
215
void led_red(unsigned char state)
216
{
217
  if (state == 0x00)
218
  {
219
    LED_PORT &= ~LED_RED;
220
  } else
221
  {
222
    LED_PORT |= LED_RED;
223
  }
224
}
225
226
// Set or unset the green LED
227
void led_green(unsigned char state)
228
{
229
  if (state == 0x00)
230
  {
231
    LED_PORT &= ~LED_GREEN;
232
  } else
233
  {
234
    LED_PORT |= LED_GREEN;
235
  }
236
}
237
238
239
// Cube buffer draw interrupt routine
240
ISR(TIMER2_COMP_vect)
241
{
242
243
  // AND the reverse bitmask onto the layer port.
244
  // This disables all the layers. rendering all the leds off.
245
  // We don't want to see the cube updating.
246
  LAYER_PORT &= LAYERS_R;
247
248
  // Take the current 2D image at the current layer along the Z axis
249
  // and place it on the LED grid.
250
  GRID1 = (0x0f & cube[current_layer][0]) | (0xf0 & (cube[current_layer][1] << 4));
251
  GRID2 = (0x0f & cube[current_layer][2]) | (0xf0 & (cube[current_layer][3] << 4));
252
253
  // Enable the apropriate layer
254
  LAYER_PORT |= (0x01 << (7 - current_layer));
255
256
  // The cube only has 4 layers (0,1,2,3)
257
  // If we are at layer 3 now, we want to go back to layer 0.
258
  if (current_layer++ == 3)
259
    current_layer = 0;
260
}
261
262
void ioinit (void)
263
{
264
  // ### Initiate I/O
265
  
266
  // Data Direction Registers
267
  // Bit set to 1 means it works as an output
268
  // Bit set to 1 means it is an input
269
  DDRA = 0xff;  // Inner cube byte
270
  DDRB = 0xf7;  // ISP and 0-1: led. 3: button
271
  DDRC = 0xff;  // Outer cube byte
272
  DDRD = 0xff;  // Layer select
273
  
274
  // Set all ports OFF, and enable pull up resistors where needed.
275
  PORTA = 0x00;
276
  PORTC = 0x00;
277
  PORTB = 0x08; // Enable pull up button.
278
  PORTD = 0x00;
279
280
  // ### Initiate timers and USART
281
282
  // Frame buffer interrupt
283
  TCNT2 = 0x00;  // initial counter value = 0;
284
  TIMSK |= (1 << OCIE2); // Enable CTC interrupt
285
  
286
  // Every 1024th cpu cycle, a counter is incremented.
287
  // Every time that counter reaches 15, it is reset to 0,
288
  // and the interrupt routine is executed.
289
  // 14745600/1024/15 = 960 times per second
290
  // There are 4 layers to update..
291
  // 14745600/1024/15/4 = 240 FPS
292
  // == flicker free :)
293
  OCR2 = 15;       // interrupt at counter = 15
294
  TCCR2 = 0x05;     // prescaler = 1024
295
  TCCR2 |= (1 << WGM01);  // Clear Timer on Compare Match (CTC) mode
296
297
298
  // Initiate RS232
299
  // USART Baud rate: 9600
300
  UBRRH = MYUBRR >> 8;
301
  UBRRL = MYUBRR;
302
  // UCSR0C - USART control register
303
  // bit 7-6      sync/ascyn 00 = async,  01 = sync
304
  // bit 5-4      parity 00 = disabled
305
  // bit 3        stop bits 0 = 1 bit  1 = 2 bits
306
  // bit 2-1      frame length 11 = 8
307
  // bit 0        clock polarity = 0
308
  UCSRC  = 0b10000110;
309
  // Enable RS232, tx and rx
310
  UCSRB = (1<<RXEN)|(1<<TXEN);
311
  UDR = 0x00; // send an empty byte to indicate powerup.
312
313
}
314
315
316
// Blink the status LEDs a little to indicate that the device has just booted.
317
// This is usefull to see if an error is making the device reboot when not supposed to.
318
// And it looks cool.
319
void bootmsg (void)
320
{
321
  int i;
322
  LED_PORT |= LED_GREEN;
323
  for (i = 0; i < 2; i++)
324
  {
325
    // Blinky
326
    delay_ms(1000);
327
    LED_PORT &= ~LED_GREEN;
328
    LED_PORT |= LED_RED;
329
    // Blink
330
    delay_ms(1000);
331
    LED_PORT &= ~LED_RED;
332
    LED_PORT |= LED_GREEN;
333
  }
334
  delay_ms(1000);
335
  LED_PORT &= ~LED_GREEN;
336
}
337
338
339
// Delay function used in graphical effects.
340
void delay_ms(uint16_t x)
341
{
342
  uint8_t y, z;
343
  for ( ; x > 0 ; x--){
344
    for ( y = 0 ; y < 90 ; y++){
345
      for ( z = 0 ; z < 6 ; z++){
346
        asm volatile ("nop");
347
      }
348
    }
349
  }
350
}

: Bearbeitet durch User
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.