Hallo,
unten ein Programm, das eine Variable von einem SPI-Slave zu einem
SPI-Master überträgt, beides ATmega328. Auf INT0 liegt ein mittels
NAND-Gatter gebauter entprellter Schalter, der den Interrupt erfolgreich
auslöst.
Mein Problem: Das Programm läuft nur, wenn beim Start (Anlegen der Vcc)
der beiden Controller der Schalter auf HIGH liegt. Liegt er auf LOW,
kann ich so viel schalten, wie ich will, nichts passiert.
Hat jemand eine Idee?
Vielen Dank im Voraus!
RS
1
/*
2
MASTER
3
INT0 (PD2) Interrupt (beide Flanken) löst die Anforderung einer SPI-Botschaft vom Slave aus
4
Die jeweils empfangene Zahl wird an LEDS (C1...C4) ausgegeben.
5
*/
6
7
#ifndef F_CPU
8
#define F_CPU 16000000 // Der IC ist mit 16 Mhz getaktet
9
#endif
10
#include<avr/io.h>
11
#include<avr/interrupt.h>
12
13
intvolatileAnz_LEDs_an=0;
14
intSS_Pin=PB2;
15
16
intmain(void)
17
{
18
// LED-Port
19
DDRC|=(1<<DDC1)|(1<<DDC2)|(1<<DDC3)|(1<<DDC4);// C1...C4 auf "Ausgang", LEDs, Rest auf Eingang, wichtig für INT0 (PD2)
20
DDRC|=(1<<PC5);// PC5 wird nicht gebraucht, kann als Debugpin benutzt werden
21
PORTC|=(1<<PC5);// Init
22
23
sei();// Global Interrupts aktivieren
24
EIMSK|=(1<<INT0);// Enable INT0
25
EICRA|=(1<<ISC00);// Any logical change on INT0 generates an interrupt request.
26
27
// SPI Init
28
// Port B ist immer SPI-Port; PB3 = MOSI, PB5 = SCK, PB2 = SS
29
DDRB=(1<<DDB3)|(1<<DDB5)|(1<<DDB2);// Set MOSI, SS and SCK output, all others input
EICRA|=(1<<ISC00);// Any logical change on INT0 generates an interrupt request.
es ist keine so gute Idee, die Interrupts generell frei zu geben, noch
ehe alles fertig konfiguriert ist.
Das sei() kommt ganz zum SChluss, wenn alles fertig eingestellt ist,
unmittelbar vor der Hauptschleife in main().
Denn ansonsten kann es dir passieren, dass mit dem sei() schon die
ersten Interrupts zu feuern beginnen. Was bei dir natürlich ganz
besonders schlecht ist, wenn der µC gleich mal in die INT0-ISR geht, in
der du über SPI etwas auszugeben versuchst, wobei das SPI zu diesem
Zeitpunkt noch gar nicht konfiguriert ist.
Da kann dann deine Warteschleife auf das SPIF lange warten, ehe sich da
mal was tut.