ATmega32, Taster funktionieren erst, später spinnt der AVR

OP #1113506
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
OP #1113800
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?
Gast #1113803
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 ?
#1113811
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
OP #1117751
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.
OP #1119211
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren