Interrupt und PortC Atmega32

Gast #744391
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
Gast #744404
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...
Gast #744413
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
Gast #744427
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
Gast #744436
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 ?
Gast #744448
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 ?
Gast #744455
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
Gast #744464
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);;
Gast #744472
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?
Gast #744499
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
Gast #744503
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.
Gast #744570
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

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