Forum: Mikrocontroller und Digitale Elektronik ATmega32, Taster funktionieren erst, später spinnt der AVR


von Sascha M. (stryker)


Lesenswert?

Hallo,

ich habe das Pollin Evulationsboard mit einem ATmega32 und 16MHz Quarz 
und verwende CodeVisionAVR 2.03.4

Ich habe eine Schaltung aufgebaut, getestet und testen lassen bei der je 
ein Taster einen von drei Motoren drehen lässt bis ein Positionsschalter 
ein Stoppsignal gibt. Zusätzlich soll die Zeit aus einer Real-Time-Clock 
gelesen und über UART ausgegeben werden.
Das Programm funktioniert in den ersten Testläufen
(ca. 10 Tastenbetätigungen) einwandfrei, bis plötzlich alles verrückt 
spielt z. B. ein Taster startet dann zwei Motoren, die Zeitausgabe ist 
falsch oder der Positionsschalter wird nicht mehr als Stoppsignal 
erkannt (Motor läuft endlos).
Die Fehler sind in keiner Reihenfolge reproduzierbar.

Ich habe Stunden mit der Fehlersuche verbracht und alles nachgemessen, 
die Schaltung ist OK, die Signale richtig, nur der AVR spinnt.
Die RTC wird in einem Testprogramm korrekt ausgegeben und das über 
Stunden, bei gleicher Schaltung.

Ich weiß einfach nicht mehr weiter...
Ich habe bestimmt etwas übersehen und würde mich deshalb freuen wenn mit 
jemand helfen könnte.

Hier der Code:
1
/*****************************************************
2
This program was produced by the
3
CodeWizardAVR V2.03.4 Standard
4
Automatic Program Generator
5
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
6
http://www.hpinfotech.com
7
8
Project : PCOA_1.2
9
Version : 
10
Date    : 16.01.2009
11
Author  : Sascha M
12
Company :                          
13
Comments: Drei Schalter steuern je einen Motor. 
14
          Sensor deaktiviert alle Motoren.
15
          Real-Time-Clock implementiert, auslesen durch Sensor
16
17
18
19
Chip type           : ATmega32
20
Program type        : Application
21
Clock frequency     : 16,000000 MHz
22
Memory model        : Small
23
External RAM size   : 0
24
Data Stack size     : 512
25
*****************************************************/
26
27
#include <mega32.h>
28
#include <delay.h>
29
30
// I2C Bus functions
31
#asm
32
   .equ __i2c_port=0x15 ;PORTC
33
   .equ __sda_bit=1
34
   .equ __scl_bit=0
35
#endasm
36
#include <i2c.h>
37
38
// DS1337 Real Time Clock functions
39
#include <ds1337.h>
40
41
// Standard Input/Output functions
42
#include <stdio.h>
43
44
// Declare your global variables here
45
#define taster1 2   // PD2 an Pin 16
46
#define taster2 3   // PD3 an Pin 17
47
#define taster3 4   // PD4 an Pin 18
48
#define motor1 5    // LED1 und Testmotor 1
49
#define motor2 6    // LED2 und Testmotor 2
50
#define motor3 7    // Summer und Testmotor 3
51
#define sensor 5    // PC5 an Pin 27
52
//#define drucke(t) printf(#t)
53
void main(void)
54
{
55
// Declare your local variables here
56
unsigned char h,m,s,da,mo,ye;
57
58
// Input/Output Ports initialization
59
// Port A initialization
60
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
61
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
62
PORTA=0x00;
63
DDRA=0x00;
64
65
// Port B initialization
66
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
67
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
68
PORTB=0x00;
69
DDRB=0x00;
70
71
// Port C initialization
72
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
73
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
74
PORTC=0x00;
75
DDRC=0x00;
76
77
// Port D initialization
78
// Func7=Out Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In 
79
// State7=0 State6=0 State5=0 State4=T State3=T State2=T State1=T State0=T 
80
PORTD=0x00;
81
DDRD=0xE0;
82
83
// Timer/Counter 0 initialization
84
// Clock source: System Clock
85
// Clock value: Timer 0 Stopped
86
// Mode: Normal top=FFh
87
// OC0 output: Disconnected
88
TCCR0=0x00;
89
TCNT0=0x00;
90
OCR0=0x00;
91
92
// Timer/Counter 1 initialization
93
// Clock source: System Clock
94
// Clock value: Timer 1 Stopped
95
// Mode: Normal top=FFFFh
96
// OC1A output: Discon.
97
// OC1B output: Discon.
98
// Noise Canceler: Off
99
// Input Capture on Falling Edge
100
// Timer 1 Overflow Interrupt: Off
101
// Input Capture Interrupt: Off
102
// Compare A Match Interrupt: Off
103
// Compare B Match Interrupt: Off
104
TCCR1A=0x00;
105
TCCR1B=0x00;
106
TCNT1H=0x00;
107
TCNT1L=0x00;
108
ICR1H=0x00;
109
ICR1L=0x00;
110
OCR1AH=0x00;
111
OCR1AL=0x00;
112
OCR1BH=0x00;
113
OCR1BL=0x00;
114
115
// Timer/Counter 2 initialization
116
// Clock source: System Clock
117
// Clock value: Timer 2 Stopped
118
// Mode: Normal top=FFh
119
// OC2 output: Disconnected
120
ASSR=0x00;
121
TCCR2=0x00;
122
TCNT2=0x00;
123
OCR2=0x00;
124
125
// External Interrupt(s) initialization
126
// INT0: Off
127
// INT1: Off
128
// INT2: Off
129
MCUCR=0x00;
130
MCUCSR=0x00;
131
132
// Timer(s)/Counter(s) Interrupt(s) initialization
133
TIMSK=0x00;
134
135
// USART initialization
136
// Communication Parameters: 8 Data, 1 Stop, No Parity
137
// USART Receiver: On
138
// USART Transmitter: On
139
// USART Mode: Asynchronous
140
// USART Baud Rate: 9600
141
UCSRA=0x00;
142
UCSRB=0x18;
143
UCSRC=0x86;
144
UBRRH=0x00;
145
UBRRL=0x67;
146
147
// Analog Comparator initialization
148
// Analog Comparator: Off
149
// Analog Comparator Input Capture by Timer/Counter 1: Off
150
ACSR=0x80;
151
SFIOR=0x00;
152
153
// I2C Bus initialization
154
i2c_init();
155
156
rtc_set_date(16,01,9);
157
158
while (1)
159
      {
160
      if (PIND &(1<<taster1)) {     
161
          PORTD |=(1<<motor1);      //LED1 und Testmotor 1 ON
162
          }
163
      if (PIND &(1<<taster2)) {    
164
          PORTD |=(1<<motor2);      //LED2 und Testmotor 2 ON
165
          }
166
      if (PIND &(1<<taster3)) {    
167
          PORTD |=(1<<motor3);      // Summer und Testmotor 3 ON
168
          }
169
      if (PINC &(1<<sensor)) {         
170
          //delay_ms(250);
171
          PORTD &=~((1<<motor1)|(1<<motor2)|(1<<motor3)); // deaktiviert alle Motoren
172
          rtc_get_date(&da,&mo,&ye);        // 
173
          printf("\r%i.%i.200%i",da,mo,ye); // Datum lesen und an UART ausgeben         
174
          rtc_get_time(&h,&m,&s);           // 
175
          printf("\r%i:%i:%i\n",h,m,s);     // Zeit lesen und an UART ausgeben
176
          };
177
      };    // end while Arbeitsschleife
178
}           // end main

von H.Joachim S. (crazyhorse)


Lesenswert?

tja, auf jeden Fall solltest du erstmal die pullups an den 
Taster-Eingängen aktivieren - oder hast du welche extern dran?

von Sascha M. (stryker)


Angehängte Dateien:

Lesenswert?

Ich habe die Taster vom Pollinboard verwendet, ein Schaltbild habe ich 
angehangen.

von Sascha M. (stryker)


Lesenswert?

Nun hab ich die Pullups für die Taster aktiviert und die Bedingung ist 
für alle drei if Schleifen erfüllt. Somit sind extern welche 
angeschlossen. Also Pullups wieder deaktiviert.

Sind vielleicht die Schleifen falsch? Soll ich lieber switch und case 
verwenden?

Aktuell habe ich herausgefunden dass Taster1 fehlerfreier funktioniert 
als Taster2 oder Taster3...

Was kann das nur sein?

von pillepalle (Gast)


Lesenswert?

moin

mit dem IAR kenn ich mich leider nicht aus ,aber was mir aufgefallen ist

'
// I2C Bus functions
#asm
   .equ __i2c_port=0x15 ;PORTC
   .equ __sda_bit=1
   .equ __scl_bit=0
#endasm
#include <i2c.h>
'

mach doch erstmal alle include anweisungen und setz danach die anderen 
Sachen ein. Könnte ja sein das er erst die i2c.h einbinden muss um dann 
mit dem #asm
MAkro was anfangen kann.

und wie sieht es mit dem Stack aus - die Fehler Beschreibung deutet auf 
einen typischen Stack Überlauf hin , oder 
Mehrfachbenutzung/überschreiben von Var in Unterprg. oder Interupts...

keinen Simulator ?

von Gast2 (Gast)


Lesenswert?

Probiere ob es mit LED's anstelle der Motoren klappt.
Wenn ja, dann bringen die Motoren (bzw. deren Stoerungen) den Prozessor 
durcheinander.

Gast2

von Peter D. (peda)


Lesenswert?

Sascha M. wrote:
> Ich habe die Taster vom Pollinboard verwendet, ein Schaltbild habe ich
> angehangen.

Dann kann es durchaus an der Schaltung liegen, weil diese Schwachsinn 
ist.
Bei jedem Tastendruck fließt ein starker Impulsstrom (kann kurzzeitig 
10A erreichen!) über VCC, um die Kondensatoren aufzuladen.
Diese Pulse sind ideal geeignet, um die CPU durcheinander zu bringen.

Auch wenn diese Kondensatoren völlig unnötig sind, da es viel besser 
funktionierende Entprellroutinen gibt, kann man sie verwenden, wenn sie 
direkt parallel zu den Tastern liegen.
Das ist wörtlich zu nehmen, d.h. vom Layout her müssen die Verbindungen 
auf kürzestem Wege erfolgen! Dann fließt der Impulsstrom nur im Kreis 
Taster - Kondensator, d.h. nicht mehr über das Netzteil.


Peter

von Sascha M. (stryker)


Lesenswert?

pillepalle wrote:

> mach doch erstmal alle include anweisungen und setz danach die anderen
> Sachen ein. Könnte ja sein das er erst die i2c.h einbinden muss um dann
> mit dem #asm
> MAkro was anfangen kann.
Dabei macht CodeVision keine Unterschiede.

> keinen Simulator ?
Doch CodeVision benutzt den AVR Studio Simulator, leider werden nicht 
alle Dateien #include't, somit wird bei der ersten CodeVision 
spezifischen Funktion ein Fehler gemeldet.

Peter Dannegger wrote:
>Auch wenn diese Kondensatoren völlig unnötig sind, da es viel besser
>funktionierende Entprellroutinen gibt, kann man sie verwenden, wenn sie
>direkt parallel zu den Tastern liegen.
Sie liegen zum Glück in der Nähe und sind ganz gut zu gebrauchen. Kann 
das Pollinboard also nur empfehlen, wenn man nicht viel Geld ausgeben 
möchte.

Gast2 wrote:
>Probiere ob es mit LED's anstelle der Motoren klappt.
>Wenn ja, dann bringen die Motoren (bzw. deren Stoerungen) den Prozessor
>durcheinander.
Definitiv! Ich hab ein Oszilloskop an gehangen und konnte die 
Störfrequenzen und Spannungsspitzen sehen.
Die Spannung geht von 5V auf bis zu 8,5V hoch und die Frequenz war 
leider viel zu unregelmäßig um sie zu bestimmen. Der Hersteller der 
Motoren wurde angeschrieben und nach entsprechenden Entstörmöglichkeiten 
gefragt...
Leider bleibt die Antwort noch aus.

Eine eingebaute RTC, die DS1337C, liefert außerdem noch falsche Werte. 
Was zusätzlich den Fehler bei den Motoren bestätigt, vor allem weil dies 
mit LED's nicht passiert.

von Skua (Gast)


Lesenswert?

Die Tasterschaltung des Boards hat bei mir zu undefiniertem Verhalten 
geführt.
Nachdem ich R7 R8 R11 C19 C17 C18 entfernt und die Taster gegen Masse 
geschaltet habe läuft es wie geschmiert.

http://www.mikrocontroller.net/articles/Pollin_ATMEL_Evaluations-Board

MfG

von Sascha M. (stryker)


Lesenswert?

Danke Skua, den Summer hab ich auch gleich ausgebaut.

Zu den Motorstörungen und somit zur Lösung:
Ich habe, weil Gleichstrommotoren, ein Gleichspannungsnetzteil nur für 
die Motoren verwendet. Jetzt schaltet der ATmega32 die Basis des 
Transistors durch an dem die externe Spannungsquelle hängt. Massen 
beider Spannungsquellen miteinander verbinden.
Eine andere Lösung wäre mit Gleichstromstellern oder auch DC-DC-Wandler 
möglich gewesen, wenn gewünscht könnte auch noch anstatt einem 
Transistor ein Optokoppler eingebaut werden.

Vielen Dank für eure Hilfe

Gruß, Sascha

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.