Forum: Mikrocontroller und Digitale Elektronik atmega 1284P Jtag (aus) PINC2 ohne Funktion


von Andreas K. (bochum)


Angehängte Dateien:

Lesenswert?

JTAG ist nicht aktiv

Die pins 25,26 und 27 funktionieren nur pin 24 ist ohne funktion

also PC2

hatt jemand eine Idee woran dieses liegen kann?
1
/*
2
 * $safeprojectname$.c
3
 *
4
 * Created: 05.02.2013 16:08:47
5
 *  Author: 
6
 */ 
7
8
9
#define F_CPU 8000000                        // Taktfrequenz 8 MHz
10
#include <avr/io.h>
11
12
  
13
#include <util/delay.h>
14
15
#include <avr/interrupt.h>
16
17
//  USER
18
#include "lcd-routines.h"
19
#include "adc.h"
20
21
//  DEF
22
23
#define    debounce_time 25                    // Entprellen der Tastereingänge
24
#define   Taster_S1  bit_is_set(PIND,4)              // PIND2 als Taster_S1
25
#define    Taster_S2  bit_is_set(PIND,3)              // PIND3 als Taster_S2
26
#define    Taster_S3  bit_is_set(PIND,2)              // PIND4 als Taster_S3
27
28
// Output
29
#define led_rot_an PORTD  |= (1<<PD0)
30
#define led_gelb_an PORTD  |= (1<<PD1)
31
#define led_gruen_an PORTD  |= (1<<PD5)
32
33
#define led_rot_aus PORTD  &= ~(1<<PD0)
34
#define led_gelb_aus PORTD  &= ~(1<<PD1)
35
#define led_gruen_aus PORTD  &= ~(1<<PD5)
36
37
#define test1_aus  PORTC  &= ~(1<<PC2)
38
#define test2_aus  PORTC  &= ~(1<<PC3)
39
#define test3_aus  PORTC  &= ~(1<<PC4)
40
#define test4_aus  PORTC  &= ~(1<<PC5)
41
42
#define test1_an  PORTC  |= (1<<PC2)
43
#define test2_an  PORTC  |= (1<<PC3)
44
#define test3_an  PORTC  |= (1<<PC4)
45
#define test4_an  PORTC  |= (1<<PC5)
46
47
48
49
/***************************************************************************************************************/
50
char buffer1 [4];                          // Speichername "buffer" mit 4 Stellen
51
char buffer2 [4];                          // Speichername "buffer2" mit 4 Stellen
52
int messwert1,messwert2,x=10,Auswahl,a1=0,a2=0,a3=0,referenzpunkt_angefahren=0,reset=0;                // Speichername "messwert" A/D-Wandler Stellwert
53
54
uint8_t vs[4]={36,20,24,40},hs[8]={36,4,20,16,24,8,40,32},n;        // Bit Tabelle für Pin 3-5
55
//uint8_t vs[4]={9,5,6,10},hs[8]={9,1,5,4,6,2,10,8},n;
56
57
  
58
void initialisieren()
59
{
60
  /*
61
  uint8_t tmp = 1<<JTD; // Disable JTAG
62
  MCUCR = tmp; // Disable JTAG
63
  MCUCR = tmp; // Disable JTAG
64
  */
65
  
66
  
67
  
68
  lcd_init();                            // LCD aktivieren
69
  lcd_clear();                          // LCD generell löschen
70
  
71
  //ADC_Init();                            // Analog-Digital-Wandler aktivieren
72
  
73
  
74
  DDRD &=~ ((1<<PD2)|(1<<PD3)|(1<<PD4));              //Eingänge
75
  DDRD |= (1<<PD0)|(1<<PD1)|(1<<PD5)|(1<<PD6);                //Ausgänge LED
76
  DDRC |= ((1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5));          //Schrittmotor ausgänge
77
  
78
  
79
  
80
81
  
82
  DDRC=60;// 15 60
83
  //PORTC=0x0f;
84
  //PORTC=60;
85
  n=0;
86
}
87
88
void rechtslauf_Vschritte(uint16_t ns)
89
{
90
  uint16_t z;
91
  for ( z=0;z<ns;z++)
92
  {
93
    n++;
94
    PORTC=vs[n&3];
95
    _delay_ms(10);
96
  }
97
}
98
99
void linkslauf_Vschritte(uint16_t ns)
100
{
101
  if (referenzpunkt_angefahren)
102
  {uint16_t z;
103
  for(z=0;z<ns;z++){
104
    n--;
105
    PORTC=vs[n&3];
106
    _delay_ms(10);
107
  }
108
  
109
  }
110
}
111
112
void rechtslauf_Hschritte(uint16_t ns)
113
{
114
  lcd_setcursor(0,2);
115
    lcd_string("                ");              //so wird nur die zweite Zeile gelöscht
116
    
117
  if (referenzpunkt_angefahren)
118
  {
119
    
120
    
121
    uint16_t z;
122
    for (z=0;z<ns;z++){
123
      n++;
124
      PORTC=hs[n&7];//7
125
      _delay_ms(10);//10
126
    
127
    if (reset==1)                      //verhindert bei einem reset das der motor weiterläuft
128
    {
129
      break;
130
    }
131
    
132
    
133
    lcd_setcursor(0,2);
134
    itoa (z,buffer2,10);
135
    lcd_string(buffer2);
136
    Reset2();
137
  }
138
  }
139
  
140
}
141
142
void linkslauf_Hschritte(uint16_t ns)
143
{
144
  lcd_setcursor(0,2);                      //so wird nur die zweite Zeile gelöscht
145
  lcd_string("                ");
146
  
147
  if (referenzpunkt_angefahren)
148
  {
149
    
150
    
151
    uint16_t z;
152
    for(z=0;z<ns;z++){
153
      n--;
154
      PORTC=hs[n&7];//7
155
      _delay_ms(10);//10
156
      
157
    if (reset==1)                    //verhindert bei einem reset das der motor weiterläuft
158
    {
159
      break;
160
    }
161
    
162
    
163
    
164
    lcd_setcursor(0,2);
165
    itoa (z,buffer2,10);
166
    lcd_string(buffer2);
167
    Reset2();  
168
    
169
  }
170
  
171
  }
172
}
173
174
void motoraus()
175
{
176
  PORTC &= ~(1<<PC2)& (1<<PC3)& (1<<PC4)& (1<<PC5);
177
}
178
179
void zurueck(){
180
if (Taster_S3)
181
  {
182
    
183
    led_gruen_aus;
184
    Auswahl=0;
185
  }
186
}
187
188
void referenzfahrt()
189
{
190
191
192
if (Taster_S1) //solange das programm noch nicht eingesetzt ist
193
{
194
  referenzpunkt_angefahren=1;
195
  reset=0;
196
}
197
198
  
199
}
200
201
void hinweis()
202
{
203
  lcd_clear();
204
  lcd_setcursor(0,1);
205
  lcd_string("Zurueck mit a");
206
  lcd_setcursor(6,2);
207
  lcd_string("T3");
208
  _delay_ms(3000);
209
}
210
211
void Menue ()
212
{  
213
  lcd_clear();
214
  lcd_setcursor(0,1);
215
  lcd_string("T1 = Auto");
216
  lcd_setcursor(0,2);
217
  lcd_string("T2 = Manuell");
218
  _delay_ms(2000);
219
  
220
  lcd_clear();
221
  lcd_setcursor(0,1);
222
  lcd_string("T3=Demo");
223
  lcd_setcursor(0,2);
224
  lcd_string("T1 + T2 = Reset");
225
  _delay_ms(2000);
226
  
227
  
228
}
229
230
void auswahl()
231
{
232
  
233
  
234
  if (Taster_S1)
235
  {  
236
    led_rot_an;  
237
    hinweis();
238
    Auswahl=1;  
239
  }
240
  
241
  if (Taster_S2)
242
  {
243
    led_gelb_an;
244
    hinweis();
245
    Auswahl=2;
246
  }
247
  
248
  if (Taster_S3)
249
  {
250
    led_gruen_an;
251
    hinweis();
252
    Auswahl=3;  
253
  }
254
  
255
}
256
257
void T1()
258
{
259
  
260
  
261
  while (Auswahl==1)
262
  {
263
    
264
    
265
    lcd_clear();
266
    lcd_setcursor(5,1);
267
    lcd_string("Auto");
268
    _delay_ms(500);
269
    
270
    
271
    
272
      
273
    /*####################Auto programm############## */
274
    
275
    test1_an;
276
    lcd_setcursor(0,2);
277
    lcd_string("24");
278
    _delay_ms(500);
279
    test1_aus;
280
    _delay_ms(500);
281
    
282
    test2_an;
283
    lcd_setcursor(0,2);
284
    lcd_string("25");
285
    _delay_ms(500);
286
    test2_aus;
287
    _delay_ms(500);
288
    
289
    test3_an;
290
    lcd_setcursor(0,2);
291
    lcd_string("26");
292
    _delay_ms(500);
293
    test3_aus;
294
    _delay_ms(500);
295
    
296
    test4_an;
297
    lcd_setcursor(0,2);
298
    lcd_string("27");
299
    _delay_ms(500);
300
    test4_aus;
301
    _delay_ms(500);
302
303
    
304
    
305
    /*#####################bis hier################## */
306
    
307
    if (Taster_S3)
308
    {
309
      
310
      led_rot_aus;
311
      Auswahl=0;
312
    }
313
    Reset2();
314
    }
315
  }
316
317
void T2()
318
{
319
  
320
  while (Auswahl==2)
321
  {
322
    lcd_clear();
323
    lcd_setcursor(5,1);
324
    lcd_string("Manuell");
325
    _delay_ms(500);
326
    
327
    /*####################Manuell programm ############## */
328
    
329
    
330
    
331
    
332
    /*#####################bis hier################## */
333
    
334
    if (Taster_S3)
335
    {
336
      
337
      led_gelb_aus;
338
      Auswahl=0;
339
    }
340
    Reset2();
341
  }
342
343
  
344
  
345
  
346
  
347
}
348
349
void T3()
350
{
351
  while (Auswahl==3)
352
  {
353
    lcd_clear();
354
    lcd_setcursor(5,1);
355
    lcd_string("Demo");
356
    _delay_ms(500);
357
    zurueck();
358
    Reset2();
359
    /*####################Demo programm ############## */
360
    
361
    if (Auswahl==3)
362
    {
363
    rechtslauf_Hschritte(200);
364
    motoraus();
365
    _delay_ms(1000);
366
    zurueck();
367
    
368
    linkslauf_Hschritte(300);
369
    motoraus();
370
    _delay_ms(1000);
371
    zurueck();
372
    
373
    
374
    }
375
    
376
    if (Auswahl==3)
377
    {
378
    rechtslauf_Hschritte(300);
379
    motoraus();
380
    _delay_ms(1000);
381
    zurueck();
382
    
383
    linkslauf_Hschritte(200);
384
    motoraus();
385
    _delay_ms(1000);
386
    zurueck();
387
    
388
    }
389
    
390
    if (Auswahl==3)
391
    {
392
    rechtslauf_Hschritte(400);
393
    motoraus();
394
    _delay_ms(1000);
395
    zurueck();
396
    
397
    linkslauf_Hschritte(400);
398
    motoraus();
399
    _delay_ms(1000);
400
    zurueck();
401
    
402
    }
403
    
404
    
405
    /*#####################bis hier################## */
406
    
407
    
408
    
409
  }
410
  
411
  
412
}
413
414
void Reset()
415
{
416
  if (Taster_S1 && Taster_S2)
417
  {
418
  
419
  lcd_clear();
420
  lcd_string("Reset");
421
  led_gelb_an;
422
  led_gruen_an;
423
  led_rot_an;
424
  _delay_ms(2000);
425
  led_rot_aus;
426
  _delay_ms(1000);
427
  led_gelb_aus;
428
  _delay_ms(1000);
429
  led_gruen_aus;
430
  lcd_setcursor(6,1);
431
  Auswahl=0;
432
  referenzpunkt_angefahren=0;
433
}
434
}
435
436
void Reset2()
437
{
438
  
439
440
x=5;
441
while (Taster_S1 && Taster_S2 && Auswahl>0)
442
{
443
  lcd_clear();
444
  lcd_setcursor(0,1);
445
  lcd_string("Reset in");
446
  lcd_setcursor(0,2);
447
  itoa (x,buffer1,10);
448
  lcd_string(buffer1);
449
  lcd_string(" Sekunden");
450
    
451
  if (x<1)
452
  {
453
    
454
    Reset();
455
    reset=1;
456
    
457
  }
458
  _delay_ms(1000);
459
  x=x-1;
460
}
461
}
462
463
int main(void)
464
{
465
while (1)
466
{
467
  
468
  
469
initialisieren();
470
referenzfahrt();  
471
472
while (referenzpunkt_angefahren==1)
473
474
{  
475
    while (Auswahl==0)
476
    {
477
      Menue();
478
      auswahl();
479
    }
480
    
481
    while (Auswahl==1)
482
    {
483
      T1();
484
    }
485
  
486
    while (Auswahl==2)
487
    {
488
      T2();
489
    }
490
    
491
    while (Auswahl==3)
492
    {
493
      T3();
494
    }
495
    
496
    
497
}
498
499
}
500
501
}

von Karl H. (kbuchegg)


Lesenswert?

Definiere 'funktioniert nicht'

1
void motoraus()
2
{
3
  //
4
  // PORTC &= ~(1<<PC2)& (1<<PC3)& (1<<PC4)& (1<<PC5);
5
6
  // sollte sein
7
  PORTC &= ~( (1<<PC2)& (1<<PC3)& (1<<PC4)& (1<<PC5) );
8
}

von Andreas K. (bochum)


Lesenswert?

Danke für den Hinweis!

Daran liegt es leider nicht.

Wenn ich z.B. T1 aufrufe sollen nacheinander PC2 an aus PC3 an aus usw 
geschaltet werden.

(Ist nur zum test eingefügt worden.)

In einer Simulation funktioniert das programm ohne probleme, in der 
Hardware will der PC2 nicht schalten. Bzw eine angeschlossenen LED mit 
vorwiderstand leuchtet nicht. Alle anderen funktionieren.

von J.-u. G. (juwe)


Lesenswert?

Andreas K. schrieb:
> Wenn ich z.B. T1 aufrufe sollen nacheinander PC2 an aus PC3 an aus usw
> geschaltet werden.

Andreas K. schrieb:
1
#define   Taster_S1  bit_is_set(PIND,4)              // PIND2 als Taster_S1
2
#define    Taster_S2  bit_is_set(PIND,3)              // PIND3 als Taster_S2
3
#define    Taster_S3  bit_is_set(PIND,2)              // PIND4 als Taster_S3

Vermutlich rufst Du aber nicht T1() auf, sondern T3().

von J.-u. G. (juwe)


Lesenswert?

Karl Heinz Buchegger schrieb:
> // sollte sein
>   PORTC &= ~( (1<<PC2)& (1<<PC3)& (1<<PC4)& (1<<PC5) );

Wohl eher:
PORTC &= ~( (1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5) );

von Andreas K. (bochum)


Lesenswert?

nein das passt schon.

Die LED`s an PC3 PC4 PC5 gehen an nur PC2 will nicht...

ein programmfeheler schließe ich auch aus, weil in der sumulation 
funktioniert dieses.

von Karl H. (kbuchegg)


Lesenswert?

1
int messwert1,messwert2,x=10,Auswahl,a1=0,a2=0,a3=0,referenzpunkt_angefahren=0,reset=0;                // Speichername "messwert" A/D-Wandler Stellwert

Quetsch nicht alles so in 1 Zeile.
Für die Hälfte der Variablen tut es auch in uin8_t. Man muss dem AVR 
keine 16 Bit Arithmetik aufzwingen, wenn es gar nicht notwendig ist.

1
char buffer1 [4];                          // Speichername "buffer" mit 4 Stellen
2
char buffer2 [4];                          // Speichername "buffer2" mit 4 Stellen
Noch ist es kein Problem, weil deine Zahlen nicht groß genug sind. Aber 
irgendwann wirst du da nicht mehr damit auskommen. 3 Zeichen (+ das '\0' 
Zeichen) reicht nicht wirklich aus, wenn man eine universelle 
Zahlenausgabe haben will. Mach dir halt eine einfach zu benutzende 
Funktion dafür!
1
void lcd_int( uint8_t line, uint8_t col, int number )
2
{
3
  char buffer[7];
4
  itoa( buffer, number, 10 );
5
6
  lcd_setcursor( line, col );
7
  lcd_string( buffer );
8
}
... dann hast du an einer Stelle (in einer Funktion) alles beisammen und 
einfacher zu benutzen ist sie auch noch, als wie wenn du den Code mit 
lcd_setcursor Aufrufen fluten musst. Dasselbe schadet auch nicht bei 
String-Ausgaben. Wenn, wie in deinem Fall sowieso so gut wie jede 
Ausgabe mit einem lcd_setcursor eingeleitet wird, dann kann man sich das 
auch im Sinne der Code-Vereinfachung, in einer Funktion zusammenfassen
1
void lcd_text( uint8_t line, uint8_t col, const char* text )
2
{
3
  lcd_setcursor( line, col );
4
  lcd_string( text );
5
}


1
uint8_t vs[4]={36,20,24,40},hs[8]={36,4,20,16,24,8,40,32},n;        // Bit Tabelle für Pin 3-5
es gibt Codebereiche, in denen ist die Angabe von Dezimalzahlen so 
ziemlich die dümmste Schreibweise die man benutzen kann. Mit diesen 
Arrays schaltest du die Pins entsprechend. Dann benutz auch eine 
Schreibweise, in der man das sehen kann! Dann kannst du dir auch den 
nichtssagenden Kommentar sparen.
1
uint8_t vs[4] = { 0b00100100,
2
                  0b00010100,
3
                  0b00011000,
4
                  0b00101000
5
                };
6
7
uint8_t hs[8] = { 0b00100100,
8
                  0b00000100,
9
                  0b00010100,
10
                  0b00010000,
11
                  0b00011000,
12
                  0b00001000,
13
                  0b00101000,
14
                  0b00100000
15
                };
16
17
uint8_t n;

von Karl H. (kbuchegg)


Lesenswert?

J.-u. G. schrieb:
> Karl Heinz Buchegger schrieb:
>> // sollte sein
>>   PORTC &= ~( (1<<PC2)& (1<<PC3)& (1<<PC4)& (1<<PC5) );
>
> Wohl eher:
> PORTC &= ~( (1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5) );

Ja, richtig.
Da hab ich nicht komplett aufgepasst. Danke für die Korrektur.

von Karl H. (kbuchegg)


Lesenswert?

Andreas K. schrieb:
> nein das passt schon.
>
> Die LED`s an PC3 PC4 PC5 gehen an nur PC2 will nicht...
>
> ein programmfeheler schließe ich auch aus, weil in der sumulation
> funktioniert dieses.

Dann schlage ich ein Testprogramm vor
1
#include <avr/io.h>
2
3
int main()
4
{
5
  DDRC = 0xFF;
6
7
  PORTC = 0xFF;
8
9
  while( 1 ) {
10
  }
11
}

wenn da der Pin sauber auf 1 geht, dann gibt es in deinem Programm einen 
Fehler, der sich irgendwo in dem Wust an unübersichtlichem Code 
versteckt.

von Andreas K. (bochum)


Lesenswert?

ok

werde ich beherzigen.

Diese Tabelle ist für die ansteuerung eines schrittmotors in der 
endsprechen reihenfolge.

Leider hatt dieser Teil nichts mit dem Problem zu tun.

in void T1() rufe ich doch nacheinander

test1_aus
test1_aus

auf

aber der PORTC will nicht (PC2) will nicht
alle anderen sind ohne Problem

von Andreas K. (bochum)


Lesenswert?

int main()
{
  while(1)
  {

    DDRB  = 0b11111111;
    DDRA  = 0b11111111;
    DDRC  = 0b11111111;
    DDRD  = 0b11111111;
    PORTA = 0b11111111;
    PORTB = 0b11111111;
    PORTC = 0b11111111;
    PORTD = 0b11111111;
    _delay_ms(2000);
    DDRB  = 0b00000000;
    DDRA  = 0b00000000;
    DDRC  = 0b00000000;
    DDRD  = 0b00000000;
    PORTA = 0b00000000;
    PORTB = 0b00000000;
    PORTC = 0b00000000;
    PORTD = 0b00000000;
    _delay_ms(1000);

  }
}


genau das gleiche

es schein fast so als wäre dieser pinn nicht ansprechbar oder reserviert

von Christoph H. (Gast)


Lesenswert?

Andreas K. schrieb:
> genau das gleiche
>
> es schein fast so als wäre dieser pinn nicht ansprechbar oder reserviert

Wenn es nicht die Software ist, dann wirst Du wohl seitens der Hardware 
suchen müssen.

Mögliche Fehlerquellen wären z.B.:
- Kurzschluss auf der Platine
- Kurzschluss / Defekt vom Bauteil am PIN
- Pin hat gar keine Verbindung
- Mikrocontroller defekt

Du kannst ja mal versuchen den Mikrocontroller "lose" oder in einem 
Development-Board zu betreiben - wenn der Fehler bleibt, dann ist 
vermutlich der µC hinüber.

Gruß Chris

von Andreas K. (bochum)


Lesenswert?

oh mei oh mei


jawohl Masseschluss vom pinn

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.