Hallo,
Ich habe mir einen Münzprüfer zugelegt und möchte diesen mit dem
Microcontroller (ATmega 2560) ansteuern. Der Münzprüfer sendet für jede
eingestellte Münze (in meinem Fall 50c, 1€ und 2€) eine unterschiedliche
Pulsanzahl mit einer Pausenzeit von 100ms pro Puls aus. Dieses Pulse
zähle ich per externen Interrupt. Um jetzt die eingeworfene Münze
erkennen zu können, fasse ich die Pulse in "Blöcke" zusammen, damit ich
erkennen kann, dass z.B zuerst eine 1€ Münze mit 10 Pulsen und dann eine
2€ Münze mit 20 Pulsen eingeworfen wurde. Dazu starte ich nach jeden
Interrupt einen 16-bit Timer in der ISR des externen Interrupts mit
einem Prescaler von 1024 (in diesem Fall testweise) um auf eine Laufzeit
von 4.19s zu erhalten (Quarztakt vom µC sind 16MHz). Wenn ein externen
Interrupt auftritt, bevor der Timer Overflow Interrupt ausgelöst wird,
soll der Timer neugestartet werden. Wenn dann der letzte Puls
aufgetreten ist, wird der Timer bis zum Overflow nicht mehr neugestartet
und dann in der Timer Overflow ISR "beendet". Dabei wird auch ausgegeben
welche Münze eingeworfen würde und der Zählstand zurückgesetzt.
Ich habe den Code geschrieben und stehe vor dem Problem, dass der Timer
direkt nach dem setzen der Register auslöst wird und in die Timer
Overflow ISR geht.
Der externe Interrupt und die Übertragung zum PC funktioniert
einwandfrei.
Benutzt habe ich AVR Studio 7.0 und programmiert habe ich in c.
Ist dieses Vorgehen so wie ich es vorhabe machbar?
1 | #include <Arduino.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include "USART.h"
|
5 | #include "Wait.h"
|
6 |
|
7 | volatile uint16_t x=0;
|
8 |
|
9 | void setup()
|
10 | {
|
11 | DDRE=0x00;
|
12 | PORTE=0xFF;
|
13 | DDRA=0xFF;
|
14 | PORTA=0x00;
|
15 |
|
16 | USARTInit(0,9600,0,0,1,0);
|
17 |
|
18 | //PIN2 INT4
|
19 | EICRB|=(1<<ISC41)|(1<<ISC40); //externer Interrupt
|
20 | EIMSK|=(1<<INT4);
|
21 |
|
22 | sei();
|
23 | }
|
24 |
|
25 | void loop(void)
|
26 | {
|
27 | PORTA=0x00;
|
28 | WaitMs( 500);
|
29 | PORTA=0xFF;
|
30 | WaitMs(500);
|
31 | }
|
32 |
|
33 | ISR(INT4_vect)
|
34 | {
|
35 | TCCR5B&=~((1<<CS52)|(1<<CS50)); //Timer löschen
|
36 |
|
37 | //Timer 5 1024 Prescaler
|
38 | TCCR5B|=(1<<CS52)|(0<<CS51)|(1<<CS50); //Timer starten
|
39 | TIMSK5|=(1<<TOIE5);
|
40 |
|
41 | x++;
|
42 | }
|
43 |
|
44 | ISR(TIMER5_OVF_vect)
|
45 | {
|
46 | if (x==1)
|
47 | {
|
48 | printf("50 Cent \n");
|
49 | }
|
50 | else if (x==10)
|
51 | {
|
52 | printf("1 Euro \n");
|
53 | }
|
54 | else if (x==20)
|
55 | {
|
56 | printf("2 Euro \n");
|
57 | }
|
58 | else
|
59 | {
|
60 | printf("Fehler \n");
|
61 | }
|
62 | x=0;
|
63 | TCCR5B&=~((1<<CS52)|(1<<CS50));
|
64 | }
|