
Zitat von
askazo
Kann es sein, dass ...
- Spannung bricht durch zu hohen Stromfluss zusammen
- Controller geht durch mangelnde Spannung aus ...
Solche Problemchen hatten mich eine Weile genervt. Heute nicht mehr. Ich mache zu Beginn meiner Programme immer, gleich nach Initialisierung der Ports und noch bevor irgendwelche Interrupts gesetzt oder Variablen definiert werden, eine Blinkschleife, siehe den folgenden Code, ziemlich weit unten, ab "for(i=0; i<10; i++)" :
Code:
// =================================================================================
// ===== Subroutinen =============================================================
// =================================================================================
/*### Programm pausieren lassen !! Der Pausenwert ist nur experimentell !*/
void waitms(uint16_t ms)
{
for(; ms>0; ms--)
{
// uint16_t __c = 4000;
uint16_t __c = 4913; // für m168/20MHz ohne IRS
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__c)
: "0" (__c)
);
}
}
// =================================================================================
// ===== ENDE Subroutinen =====================================================
// =================================================================================
// =================================================================================
// === HAUPTProgramm ==============================================================
// Initialisierungen, LED1 kurzblinken als Signal für Programmstart
int main(void)
{
uint16_t i;
// Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
// A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
DDRB = 0b10011111; // siehe aktuell oben oder Fortschritt/R2D2
PORTB = 0b01100000; // und Port/Pull Ups (1) aktivieren
// DDRB = 0b00011111; // siehe aktuell oben oder Fortschritt/R2D2
// PORTB = 0b11100000; // und Port/Pull Ups (1) aktivieren
DDRC = 0b01110000; // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168
PORTC = 0b00000111; // Beachte für ADC: PC3 ist ADC-Eingang ##>> OHNE Pullup !!
//
DDRD = 0b11110000; // -> siehe unter DDRB, sowie PD2,3 extInt
PORTD = 0b00001111; // Pull Ups aktivieren
// Encoder_1 = ExtINT0 = PortD2, Encoder_2 = PortD3
. . . . . . . . . . . .
for(i=0; i<10; i++) // LED auf PD1 blinken lassen
// ###>>> bevor Interrupts erlaubt sind, um ungewollte
// Resets u.ä. besser erkennen zu können
{
PORTD |= (1<<PD1); // LED auf PD1 schalten EIN, HELL
waitms(20); // ... damit man kurze resets besser erkennt
PORTD &= ~(1<<PD1); // LED auf PD1 schalten AUS, Dunkel
waitms(80);
}
PORTD |= (1<<PD1); // LED auf PD1 schalten EIN, HELL
waitms ( 2000);
// ================================================================================
// Testabschnitt(e).
// ================================================================================
Dieses typische Blinken kostet kaum Programmplatz und zeigt mir an, dass ein Reset da war . . . . .
Lesezeichen