www.mikrocontroller.net

Forum: Compiler & IDEs TWI-ISR definieren


Autor: Jey Bee (jeybee)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Moin

Ich bin gerade wie deran, am TWI-Slave zu basteln. Da ich zur zeit noch 
keine Interrupts verwende, sondern alles polle, kann der Slave sonst 
halt nicht viel machen. Darum will ich nun meinen TWI-Slave mit dem 
Interrupt betreiben.

Hierzu habe ich in Datasheet des ATmega16s im Kapittel "Interrupts" 
geseh, dass es schon einen TWI vektor gibt. Nun gut.

Anscheinend verstehe ich da was falsch: Ich habe nun die 
<avr/interrupt.h> eingebunden, sei(); gesetzt und nun die ISR mit dem 
TWI-Vektor initialisiert. Jedoch passiert nun garnichts. Der Master 
sendet die Slave Adresse etc, jedoch kriegt weder der Master noch der 
Slave irgend ein Ack oder so.

Wo ist mein Fehler? habe ich irgend welche Register übersehen, die es zu 
sezten gibt?

Hier mein Code:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "twislave.h"
#include "lcd.h"


int main(void)
{
  uint8_t twisend;             // TWI sendevariable
  uint8_t twirecive;          // TWI empfangsvariable
  unsigned char buffer[10];      // Buffer für itoa
  
  lcd_init(LCD_DISP_ON);
  twi_slave_init(0x00);               // TWI Slave initialisieren & Adresse festloegen
  sei();


  while(1)
  {
    twisend = 0xCB;

/*
    twi_slave_transmit(twisend);

    //twirecive = twi_slave_recive();

    lcd_clrscr();
    lcd_gotoxy(0,0);
    lcd_puts("I am your Slave");
    lcd_gotoxy(0,1);
    lcd_puts("Senden: 0x");
    lcd_puts(itoa(twisend, buffer, 16));
  */
  }
}


ISR(TWI_vect)
{
  lcd_clrscr();
  lcd_gotoxy(0,0);  
  lcd_puts("Okay");    //Test
}


Danke und Greez Jey

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, der Fehler liegt vermutlich in Zeile 42 von twi_slave_init().

Oliver

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> Tja, der Fehler liegt vermutlich in Zeile 42 von twi_slave_init().

QUATSCH!!!  Deine Glaskugel ist nur Kaputt ;-)

Autor: Jey Bee (jeybee)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist denn nun? warum sollte in der init ein Fehler sein?

Autor: me (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube, dass der Fehler eher in der "twislave.h" ist. Ein 
Deklarationsfehler.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jey Bee schrieb:
> Was ist denn nun? warum sollte in der init ein Fehler sein?

Weil irgendwo ein Fehler ist.
Und in dem was du gepostet hast, ist er nicht (ausser das du TWINT nicht 
löscht, das ist aber jetzt noch nciht das Problem). Das ist aber auch 
keine Kunst, den das was du gepostet hast, macht ausser andere 
Funktionen aufrufen ja auch nichts wirklich Aufregendes.

Und nachdem es die LCD Funktionen höchst wahrscheinlich nicht sind, 
bleibt eigentlich nur noch die twi_slave_init als Kandidat übrig. Du 
hast doch dort den Interrupt freigeschaltet, oder?

Autor: JeyBee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Also das LCD funktioniert.
Tschuldigung, habe am anfang vergessen, die twislave.c mit zu posten.
Hier mal die twislave.c:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "twislave.h"

void twi_slave_init(uint8_t slaveadr)
{
   TWAR = slaveadr;
   TWCR |= (1<<TWEN) | (1<<TWEA);
}

uint8_t twi_slave_transmit(uint8_t twi_transmit)
{
  while(!(TWCR & 0b10000000)); //solange warten, bis was ankommt
  TWDR = twi_transmit;    //Zu Übermittelnden Wert in TWDR schreiben
  TWCR |= (1<<TWINT);
  return 0;
}

uint8_t twi_slave_recive(void)
{
  uint8_t twi_status;
  uint8_t twirecive;
  
  while(!(TWCR & 0b10000000));   //  solange warten, bis was ankommt
  twi_status = TWSR;        //  Status abfragen..

  TWCR &=~ (1<<TWINT);      //  TWINT auf 0 setzten damit TWI wieder arbeitet
  TWCR |=  (1<<TWEA);        //  TWEA auf 1 setzten um Ack zu senden  
    
  if(TWSR == 128)
  {
    twirecive = TWDR;
  }
  return twirecive;
}

Also speziell für die Interrupts hab ich jetzt nichts geändert, demfall 
muss da der Fehler liegen.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe nicht, dass du da irgendwo den TWI-Interrupt freischaltest.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
· Bit 0 ­ TWIE: TWI Interrupt Enable

When this bit is written to one, and the I-bit in SREG is set,
the TWI interrupt request will be activated for as long as the
TWINT Flag is high.

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.