Forum: Mikrocontroller und Digitale Elektronik Interrupt und PortC Atmega32


von MW (Gast)


Lesenswert?

1
int main (void) {            
2
   TWCR &=~(1<<TWEN)|(1<<2);;
3
  DDRC  = 0x00;     // Port C als Ausgang defeniert
4
  PORTC = (0x01);     // Port C1 initialisiert
5
  _delay_ms(100);
6
  lcd_init();
7
  DDRD = 0x00;
8
  
9
  //*****************************
10
  // Interrups initialisieren
11
12
  
13
  //GICR |= (1<<INT0)|(1<<INT1);    //Int0 und INT1 eingeschaltet
14
  //MCUCR |= (1<<ISC01)|(1<<ISC00)|(1<<ISC11)|(1<<ISC10);  
15
  sei();  //allgemein Interrups einschalten  
16
  
17
  //*****************************

hi! also ich hab zwei Problem
1. Der yC springt immer in Interrupt 0 auch wenn ich den Int1 aktivier
2. PortC Pin0 und Pin1 geben noch was anderes aus, wie kann man das 
abschalten
Jtag ist abgeschaltet

von Thomas B. (detritus)


Lesenswert?

1
  DDRC  = 0x00;     // Port C als Ausgang defeniert

Eher nicht... ;)

von STK500-Besitzer (Gast)


Lesenswert?

>&=~(1<<TWEN)|(1<<2);;

~(1<<TWEN) = 0xF9
(1<<2)     = 0x04

==> TWEN &= 0xF9 | 0x04 => TWEN wird nicht verändert (das Bit 2 ist eh 
immer 0)

Ohne einen vernünfitgen Quellcode kann man nur rumstochern...

von MW (Gast)


Lesenswert?

1
int main (void) {            
2
   TWCR &=~(1<<TWEN);;
3
  DDRC  = 0xff;     // Port C als Ausgang definiert
4
  PORTC = 0x01;     // Port C1 initialisiert
5
  _delay_ms(100);
6
  lcd_init();
7
  
8
  
9
  //*****************************
10
  // Interrups initialisieren
11
12
  
13
  GICR |= (1<<INT0)|(1<<INT1);    //Int 0 eingeschaltet
14
  MCUCR |= (1<<ISC01)|(1<<ISC00)|(1<<ISC11)|(1<<ISC10);  //Wie wird der Interrupt gestartet hier:taktflanke
15
16
17
  sei();              //allgemein Interrups einschalten  
18
  
19
  //*****************************
20
21
  static unsigned int j = 0;
22
  char string[15];
23
  _delay_ms(100);
24
     while(1) {  
25
    set_cursor(0,1);
26
    sprintf(string,"j = %d",j++);
27
    lcd_string(string);
28
    _delay_ms(10);
29
    lcd_clear();
30
31
     }                         
32
 
33
  
34
return 0;                 
35
}
36
37
38
ISR(INT0_vect)       /* veraltet: SIGNAL(SIG_INTERRUPT0) */
39
{    
40
    char string[15];
41
    static unsigned int i=0;
42
43
44
    PORTC=(PORTC<<1)%0xff;
45
        
46
    
47
    
48
    set_cursor(0,1);
49
    sprintf(string,"%d",i++);
50
    lcd_string(string);
51
52
53
    
54
    set_cursor(0,2);
55
    
56
    sprintf(string,"INT0");
57
    lcd_string(string);
58
    _delay_ms(10);
59
    lcd_clear();
60
61
      /* Interrupt Code */
62
}
63
64
ISR(INT1_vect)       /* veraltet: SIGNAL(SIG_INTERRUPT0) */
65
{    
66
    char string[15];
67
    static unsigned int i=0;
68
69
70
    //PORTC=(PORTC<<1)%0xff;
71
        
72
    
73
    
74
    set_cursor(0,1);
75
    sprintf(string,"%d",i++);
76
    lcd_string(string);
77
78
79
    
80
    set_cursor(0,2);
81
    
82
    sprintf(string,"INT1");
83
    lcd_string(string);
84
    _delay_ms(10);
85
    lcd_clear();
86
87
      /* Interrupt Code */
88
}

so mmm wenn ich jetzt portc richtig als ausgang schalte dreht mein 
display durch
mein display ist an Port a angeschlossen
finde ich auf jedenfall komisch

von STK500-Besitzer (Gast)


Lesenswert?

Woher weisst du denn, an welchem Port deine LCD-Routinen das LCD 
erwarten?

von MW (Gast)


Lesenswert?

Ausschnitt von display.h
1
// Pinbelegung für das LCD, an verwendete Pins anpassen
2
#define LCD_PORTENABLE  PORTB
3
#define LCD_PORT        PORTA
4
#define LCD_DDR         DDRA
5
#define LCD_DDRENABLE  DDRB
6
#define LCD_RS          PB2
7
#define LCD_RW      PB1
8
#define LCD_EN          PB0

von holger (Gast)


Lesenswert?

Wenn du das hier sowohl in Interrupts als auch in main() verwendest
ist das auch kein Wunder.

    sprintf(string,"%d",i++);
    lcd_string(string);

von MW (Gast)


Lesenswert?

Wieso?
Das Problem ist das der total spinnt wenn ich das mach

von holger (Gast)


Lesenswert?

>Wieso?
>Das Problem ist das der total spinnt wenn ich das mach

Stell dir mal vor main() macht gerade lcd_string(string);
Dann kommt ein INT0 und ballert dir voll dazwischen
und macht ebenfalls lcd_string(string);

Was soll da wohl gutes bei rauskommen ?

von MW (Gast)


Lesenswert?

komischer weise ist das nicht mal das problem sondern wenn ich PORTC = 
0x01;
vorinitialisier
dann spinnt das display

von holger (Gast)


Lesenswert?

>komischer weise ist das nicht mal das problem sondern wenn ich PORTC =
>0x01;

Alles gequirlte Kinderkacke !

Funktionen die in main() verwendet werden, dürfen
nicht in Interrupts verwendet werden. Funktionen
die in Interrupts verwendet werden, dürfen nicht in main()
verwendet werden. Ohne Vorsichtsmassnahmen jedenfalls nicht.

>    sprintf(string,"j = %d",j++);
>    lcd_string(string);
>    _delay_ms(10);
>    lcd_clear();

Du glaubst doch nicht etwa das du dein Display in 10ms
ablesen kannst ?

von MW (Gast)


Lesenswert?

1
int main (void) {            
2
   //TWCR &=~(1<<TWEN);;
3
  DDRC  = 0xff;     // Port C als Ausgang defeniert
4
  PORTC = 0x01;      // Port C1 initialisiert
5
  _delay_ms(100);
6
  lcd_init();
7
  
8
  
9
  //*****************************
10
  // Interrups initialisieren
11
12
  
13
  //GICR |= (1<<INT0);    //Int 0 eingeschaltet
14
  //MCUCR |= (1<<ISC01)|(1<<ISC00);  //Wie wird der Interrupt gestartet hier:low aktiv
15
16
17
  //sei();              //allgemein Interrups einschalten  
18
  
19
  //*****************************
20
21
  static unsigned int j = 0;
22
  char string[15];
23
  _delay_ms(100);
24
     while(1) {
25
    
26
    set_cursor(0,1);
27
    sprintf(string,"j = %d",j++);
28
    lcd_string(string);
29
    _delay_ms(10);
30
    
31
32
     }                         
33
 
34
  
35
return 0;                 
36
}
37
38
39
ISR(INT0_vect)       // veraltet: SIGNAL(SIG_INTERRUPT0)
40
{    
41
    char string[15];
42
    static unsigned int i=0;
43
44
    
45
    PORTC=~PORTC;
46
        
47
    
48
    /*
49
    set_cursor(0,1);
50
    sprintf(string,"%d",i++);
51
    lcd_string(string);
52
53
54
    
55
    set_cursor(0,2);
56
    
57
    sprintf(string,"INT0");
58
    lcd_string(string);
59
    _delay_ms(10);
60
    lcd_clear();
61
    */
62
      // Interrupt Code 
63
}


so hab die interrupts ausgeschaltet
jetzt gibt der immer alles richtig aus wenn PORTC nicht initialisiert 
wird
ab der intialisierung
gibt der immer noch was aus aber immer nur blödsinn:
36##36##36##36##36##
und so ein kram

von MW (Gast)


Lesenswert?

Ahhhh interessant, das liegt wohl daran das ich den TWI Port 
initialisier.
wie kann ich den abschalten also das das ein reiner ausgang ist.

von STK500-Besitzer (Gast)


Lesenswert?

>das liegt wohl daran das ich den TWI Port initialisier.
>wie kann ich den abschalten also das das ein reiner ausgang ist.

machst du doch schon, indem du ihn gar nicht erst einschaltest:

>//TWCR &=~(1<<TWEN);;

von MW (Gast)


Lesenswert?

also ich hab die pots auf leds
und Pin0 und 1 sind ständig am blinken ohne das ich was mach
außerdem spinnt der yC wenn ich den auf PORTC 0x01 0x02 oder 0x03 
initialisier

mmmmm

von holger (Gast)


Lesenswert?

>also ich hab die pots auf leds

Du hast also LEDs an den Ports.
Vieleicht bricht dein schlappes Netzteil zusammen
wenn du die einschaltest ? Brown Out Reset
wäre denkbar.

von MW (Gast)


Lesenswert?

und das bricht dann nur zusammen wenn ich Pin 0 und 1 initialisier??
und alle anderen 5 LEDs ziehen gar kein strom ??? naja
hätte auf jedenfall sein können, aber das netzteil macht das schon macht 
1000mA sollte reichen.

ne ich vermute eher die geschichte mit TWI?

von holger (Gast)


Lesenswert?

>ne ich vermute eher die geschichte mit TWI?

Quatsch.

Ohne deine Schaltung wird das hier nix mehr.
Hast du einen Hauch von Kondensator in der Nähe
Vcc/GND vom uC ?

von MW (Gast)


Angehängte Dateien:

Lesenswert?

okay dann hier die schaltung

von MW (Gast)


Angehängte Dateien:

Lesenswert?

+ addon board

von holger (Gast)


Lesenswert?

>und Pin0 und 1 sind ständig am blinken ohne das ich was mach

Welcher Pin0 und Pin1 ? PORTB0 und PORTB1 ?

von MW (Gast)


Lesenswert?

nene PortC

von holger (Gast)


Lesenswert?

Entweder du hast nen JTAG Prommer angeschlossen
oder JTAG nicht abgeschaltet. PC0 und PC1 werden
vom Addon Board auf PC4,PC5 geroutet. Weiss der
Teufel wieso. Kann man da Jumper abziehen ?

von MW (Gast)


Lesenswert?

achso ne das sieht nur so aus das ist ne steckkontaktbuchse.
ich muss das dann selbst noch verdrahten.

mmmm also was mich irretiert ist folgendes wenn ich das löcd nicht 
initialisier dann blinken PC0 und PC1 nicht.

also wenn ich DDRA = 0xff; aufrufe um den Porta als ausgang zu 
definieren macht der den Mist.
wenn ich aber auch wenn es keinen sinn macht den Porta = 0xcf definiere 
dann tuts zwar mein display aufgrund der fehlenden Eingänge nur 
bescheiden, aber der PortC wird nich beeinträchtigt.
wenn ich das simuliere macht der nicht den mist

von MW (Gast)


Lesenswert?

achja ich programmier über nen seriellen MYsmartUSB
und das fusebit für Jtag ist abgeschaltet

von holger (Gast)


Lesenswert?

>mmmm also was mich irretiert ist folgendes wenn ich das löcd nicht
>initialisier dann blinken PC0 und PC1 nicht.

Das mag ich jetzt nicht mehr verstehen :(
Da ist ein ganz dicker Bug in deinem Programm oder
in der Hardware.

von MW (Gast)


Lesenswert?

@ Holger Danke für deine Mühe,

ja es war die Hardware.
Auf dem Pollinhauptboard wird PIN0 und 1 noch über jumper auf nen Eeprom 
geführt und liegen dahinter an 5v. Jumper weg ---> Problem gelöst

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.