www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt und PortC Atmega32


Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int main (void) {            
   TWCR &=~(1<<TWEN)|(1<<2);;
  DDRC  = 0x00;     // Port C als Ausgang defeniert
  PORTC = (0x01);     // Port C1 initialisiert
  _delay_ms(100);
  lcd_init();
  DDRD = 0x00;
  
  //*****************************
  // Interrups initialisieren

  
  //GICR |= (1<<INT0)|(1<<INT1);    //Int0 und INT1 eingeschaltet
  //MCUCR |= (1<<ISC01)|(1<<ISC00)|(1<<ISC11)|(1<<ISC10);  
  sei();  //allgemein Interrups einschalten  
  
  //*****************************

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

Autor: Thomas B. (detritus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  DDRC  = 0x00;     // Port C als Ausgang defeniert

Eher nicht... ;)

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

int main (void) {            
   TWCR &=~(1<<TWEN);;
  DDRC  = 0xff;     // Port C als Ausgang definiert
  PORTC = 0x01;     // Port C1 initialisiert
  _delay_ms(100);
  lcd_init();
  
  
  //*****************************
  // Interrups initialisieren

  
  GICR |= (1<<INT0)|(1<<INT1);    //Int 0 eingeschaltet
  MCUCR |= (1<<ISC01)|(1<<ISC00)|(1<<ISC11)|(1<<ISC10);  //Wie wird der Interrupt gestartet hier:taktflanke


  sei();              //allgemein Interrups einschalten  
  
  //*****************************

  static unsigned int j = 0;
  char string[15];
  _delay_ms(100);
     while(1) {  
    set_cursor(0,1);
    sprintf(string,"j = %d",j++);
    lcd_string(string);
    _delay_ms(10);
    lcd_clear();

     }                         
 
  
return 0;                 
}


ISR(INT0_vect)       /* veraltet: SIGNAL(SIG_INTERRUPT0) */
{    
    char string[15];
    static unsigned int i=0;


    PORTC=(PORTC<<1)%0xff;
        
    
    
    set_cursor(0,1);
    sprintf(string,"%d",i++);
    lcd_string(string);


    
    set_cursor(0,2);
    
    sprintf(string,"INT0");
    lcd_string(string);
    _delay_ms(10);
    lcd_clear();

      /* Interrupt Code */
}

ISR(INT1_vect)       /* veraltet: SIGNAL(SIG_INTERRUPT0) */
{    
    char string[15];
    static unsigned int i=0;


    //PORTC=(PORTC<<1)%0xff;
        
    
    
    set_cursor(0,1);
    sprintf(string,"%d",i++);
    lcd_string(string);


    
    set_cursor(0,2);
    
    sprintf(string,"INT1");
    lcd_string(string);
    _delay_ms(10);
    lcd_clear();

      /* Interrupt Code */
}



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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woher weisst du denn, an welchem Port deine LCD-Routinen das LCD 
erwarten?

Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ausschnitt von display.h
// Pinbelegung für das LCD, an verwendete Pins anpassen
#define LCD_PORTENABLE  PORTB
#define LCD_PORT        PORTA
#define LCD_DDR         DDRA
#define LCD_DDRENABLE  DDRB
#define LCD_RS          PB2
#define LCD_RW      PB1
#define LCD_EN          PB0 

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso?
Das Problem ist das der total spinnt wenn ich das mach

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: MW (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

int main (void) {            
   //TWCR &=~(1<<TWEN);;
  DDRC  = 0xff;     // Port C als Ausgang defeniert
  PORTC = 0x01;      // Port C1 initialisiert
  _delay_ms(100);
  lcd_init();
  
  
  //*****************************
  // Interrups initialisieren

  
  //GICR |= (1<<INT0);    //Int 0 eingeschaltet
  //MCUCR |= (1<<ISC01)|(1<<ISC00);  //Wie wird der Interrupt gestartet hier:low aktiv


  //sei();              //allgemein Interrups einschalten  
  
  //*****************************

  static unsigned int j = 0;
  char string[15];
  _delay_ms(100);
     while(1) {
    
    set_cursor(0,1);
    sprintf(string,"j = %d",j++);
    lcd_string(string);
    _delay_ms(10);
    

     }                         
 
  
return 0;                 
}


ISR(INT0_vect)       // veraltet: SIGNAL(SIG_INTERRUPT0)
{    
    char string[15];
    static unsigned int i=0;

    
    PORTC=~PORTC;
        
    
    /*
    set_cursor(0,1);
    sprintf(string,"%d",i++);
    lcd_string(string);


    
    set_cursor(0,2);
    
    sprintf(string,"INT0");
    lcd_string(string);
    _delay_ms(10);
    lcd_clear();
    */
      // Interrupt Code 
}


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

Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);;

Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: MW (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
okay dann hier die schaltung

Autor: MW (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
+ addon board

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>und Pin0 und 1 sind ständig am blinken ohne das ich was mach

Welcher Pin0 und Pin1 ? PORTB0 und PORTB1 ?

Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nene PortC

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MW (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.