mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TWI enable bei AT91SAM7S


Autor: Philip Kottmann (praktikant)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Bin bei meinem Projekt einen Schritt weitergekommen.

Es handelt sich immer noch um den AT91SAM7S256.

Ich bekomm aber den TWI nicht zum Laufen. Habe alle Register so gesetzt, 
wie es im Flussdiagramm im Handbuch angegeben ist. Das blöde Ding tut 
aber trotzdem keinen Mucks. Nicht mal die TWI-Clock wird ausgegeben. ist 
vielleicht mein oszi hinüber gg?
Habe im Verdacht, dass ich da noch was in den Registern des PMCs 
rumpfuschen muss.

Ist das richtig und wenn ja, welche Bits muss ich setzten?!

Danke schonmal für eure Antworten.


Gruß

Der Praktikant

Autor: Philip Kottmann (praktikant)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weiß dazu wirklich niemand was, oder weigert ihr euch nur zu antworten? 
g

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> oder weigert ihr euch nur zu antworten?

Ja.

Sollen wir alle raten was Du machst?

Wie wäre es mal mit dem Source-Code?

Und nach 3,5 Stunden schon zu jammern ist auch nicht die feine Art

Autor: Philip Kottmann (praktikant)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So sieht mein Code bisher aus. In der while(1)-Schleife sollte er 
einfach beliebige Zahlen auf die TWI-Schnittstelle ausgeben, die ich mit 
dem oszi messen kann.... Das war mein Plan.
Funktioniert das so oder bin ich auf dem Holzweg?!





#include <AT91SAM7S256.H>                 /* AT91SAM7S definitions 
*/
#include <STDIO.H>                        /* standard I/O .h-file 
*/
//#include "Board.h"


AT91S_TWI * pTWI = AT91C_BASE_TWI;       /* Global Pointer to TWI 
*/
AT91S_PIO * pPIO = AT91C_BASE_PIOA;
AT91S_PMC * pPMC = AT91C_BASE_PMC;

/* Main Program */
int main (void)  {                      /* main entry for program*/


unsigned int i;
/* Enable peripheral clocks */
//  *AT91C_PMC_PCER =   AT91C_TWI_CLDIV;


//setup the PMC

  pPMC->PMC_SCER = (AT91C_PMC_PCK & AT91C_PMC_UDP);
//  pPMC->PMC_SCER = AT91C_PMC_CSS_MAIN_CLK;
  pPMC->PMC_PCER = 0x10;
  pPMC->PMC_MCKR = 0x5;

//enable PIO-Controller for PIN 3+4

  pPIO->PIO_PER = 0x18;
  pPIO->PIO_OER = 0x18;
  pPIO->PIO_ASR = 0x18;
  pPIO->PIO_PPUER = 0x18;

/* Transmit hex-code to the Transmit Holding Register */

  pTWI->TWI_CWGR = AT91C_TWI_CLDIV;
  pTWI->TWI_CR = AT91C_TWI_MSEN;
  pTWI->TWI_MMR = (AT91C_TWI_DADR | AT91C_TWI_IADRSZ_1_BYTE);
  pTWI->TWI_MMR &= ((unsigned int) 0x0 << 12);
  pTWI->TWI_CR = AT91C_TWI_START;
  while(1) {
    for (i=200000; (pTWI->TWI_SR & AT91C_TWI_TXRDY) != 0; i--) {
      pTWI->TWI_THR = i;
      //__volatile("NOP");
      //pTWI->TWI_CR = AT91C_TWI_STOP;
    }
  }
  /*pTWI->TWI_CR = AT91C_TWI_STOP;
  while ((pTWI->TWI_SR & AT91C_TWI_TXCOMP) == 0);*/
}

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf den ersten Blick würde ich mal sagen, daß Du im PowerManager das TWI 
nicht aktiviert hast

Du hast zwar ein

pPMC->PMC_PCER = 0x10;


gemacht. Das setzt aber nicht das richtige Bit für TWI.

Passende Konstanten findest Du in

AT91SAM7S64.h

oder im Datenblatt

pPMC->PMC_PCER = (1 << AT91C_ID_TWI);

Autor: Philip Kottmann (praktikant)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk!

Mein Quelltext sieht mittlerweile aus wie unten!
Mir geht aber auch nicht in den Kopf, wieso nicht mal an PIN4 das 
Clock-Signal ausgegeben wird?!?!?! Was versteh ich denn daran nicht? 
Eigentlich ist es im Datenblatt ja (fast) idiotensicher aufgelsitet, was 
man machen muss.....




#include <AT91SAM7S256.H>                 /* AT91SAM7S definitions 
*/
#include <STDIO.H>                        /* standard I/O .h-file 
*/
//#include "Board.h"

//#define VREF  3                          /* number of records 
*/
//#define AT91C_ADC_PRESCAL_SHIFT 8        /* ADC Prescaler bit offset 
*/

AT91S_TWI * pTWI = AT91C_BASE_TWI;       /* Global Pointer to TWI 
*/
AT91S_PIO * pPIO = AT91C_BASE_PIOA;
AT91S_PMC * pPMC = AT91C_BASE_PMC;
//AT91S_ADC * pADC = AT91C_BASE_ADC;       /* Global Pointer to ADC 
*/
//extern void init_serial (void);          /* Initialize Serial 
Interface           */

/* Main Program */
int main (void)  {                      /* main entry for program 
*/

//unsigned int adval;
unsigned int i;
/* Enable peripheral clocks */
//  *AT91C_PMC_PCER =   AT91C_TWI_CLDIV;

  //(1<<AT91C_ID_ADC) |  /* enable ADC,                           */
             //(1<<AT91C_ID_US0);   /* enable USART0 
*/

  //init_serial();                         /* Initialize Serial 
Interface           */

//setup the PMC

  pPMC->PMC_SCER = (AT91C_PMC_PCK & AT91C_PMC_UDP);
//  pPMC->PMC_SCER = AT91C_PMC_CSS_MAIN_CLK;
  pPMC->PMC_PCER = (1 << AT91C_ID_TWI);
  pPMC->PMC_MCKR = 0x5;

//enable PIO-Controller for PIN 3+4

  pPIO->PIO_PER = 0x18;
  pPIO->PIO_PDR = 0x0;
  pPIO->PIO_MDER = 0x18;
  pPIO->PIO_MDDR = 0x0;
  pPIO->PIO_OER = 0x18;
  pPIO->PIO_ODR = 0x0;
  pPIO->PIO_PPUER = 0x18;
  pPIO->PIO_PPUDR = 0x0;
  pPIO->PIO_ASR = 0x18;
  pPIO->PIO_BSR = 0x0;
  pPIO->PIO_OWER = 0x18;
  pPIO->PIO_OWDR = 0x0;

/* Transmit hex-code to the Transmit Holding Register */

  pTWI->TWI_CWGR = AT91C_TWI_CLDIV;
  pTWI->TWI_CR = AT91C_TWI_MSEN;
  pTWI->TWI_MMR = (AT91C_TWI_DADR | AT91C_TWI_IADRSZ_1_BYTE);
  pTWI->TWI_MMR &= ((unsigned int) 0x0 << 12);
  pTWI->TWI_CR = AT91C_TWI_START;
  while(1) {
    for (i=200000; (pTWI->TWI_SR & AT91C_TWI_TXRDY) != 0; i--) {
      pTWI->TWI_THR = i;
      //__volatile("NOP");
      //pTWI->TWI_CR = AT91C_TWI_STOP;
    }
  }
  /*pTWI->TWI_CR = AT91C_TWI_STOP;
  while ((pTWI->TWI_SR & AT91C_TWI_TXCOMP) == 0);*/
}




Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was um alles in der Welt soll denn das machen??

//enable PIO-Controller for PIN 3+4

  pPIO->PIO_PER = 0x18;

  [...]

0x18 wäre bei mir P7 und P8

Du mußt das TWI Interface im PIO-Controller aktivieren.

Dazu mußt Du P3 und P4 im PIO_ASR setzen.


Autor: Philip Kottmann (praktikant)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich dachte mir dabei, dass ich in PIO_ASR und PIO_PER die Bits 
folgendermaßen setzen muss, damit PIN 3+4 angesprochen werden:

...0001 1000 , was ja hexadezimal zweifellos 0x18 entspricht.

also so:

//enable PIO-Controller for PIN 3+4

  pPIO->PIO_PER = 0x18;
  pPIO->PIO_PDR = 0x0;
  pPIO->PIO_MDER = 0x18;
  pPIO->PIO_MDDR = 0x0;
  pPIO->PIO_OER = 0x18;
  pPIO->PIO_ODR = 0x0;
  pPIO->PIO_PPUER = 0x18;
  pPIO->PIO_PPUDR = 0x0;
  pPIO->PIO_ASR = 0x18;
  pPIO->PIO_BSR = 0x0;
  pPIO->PIO_OWER = 0x18;
  pPIO->PIO_OWDR = 0x0;

PIO_ASR war vorher ebenfalls schon gesetzt. Daran scheints also nicht zu 
liegen. Ich hab schon sicherheitshalber die ganzen "disable"-Register 
auf 0 gesetzt um ganz sicher zu gehen. Aber nix tut sich :-(

Gruß der Praktikant

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oops sorry, was habe ich mir dabei gedacht??

Vielleicht helfen Dir Code-Beispiele

Geh mal auf www.at91.com

Dann auf KIT -> AT91SAM7S64-IAR Kit

Am Ende der Seite findest Du ein Zip mit Code für den IAR Compiler. 
Darunter ist auch TWI Beispiel.

Autor: Philip Kottmann (praktikant)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich mich eigentlich nicht einfach am Manual entlanghangeln?! Das 
erscheint mir recht gut aufgeschlüsselt, aber da keine Veränderung in 
meinem Quelltext auch nur die kleinste Reaktion im µC auslöst bin ich 
langsam echt etwas gefrustet!

Gruß
Der Praktikant

Autor: Philip Kottmann (praktikant)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat denn schon einer von euch eine Idee, warum mein obiger Quelltext 
rein gar nichts tut?!

Vielen Dank für eure Antworten.

Gruß

der Praktikant

Autor: constantin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi philip,

mit TWI hab ich mich, zum glück, noch nicht beschäftigt :-)) und kann 
dir nur so ungefähr helfen...
schau mal unter : http://www.at91.com/ ins forum und dort nach "TWI 
working" suchen. dort findest du ein beispiel code über TWI... vllt. 
hilft es dir.

gruß
constantin

Autor: constantin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder schau in die yahoo tech group:
http://tech.groups.yahoo.com/group/AT91SAM/message/1644

Autor: Philip Kottmann (praktikant)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, dankeschön für eure Antworten.
Nur brauche ich jetzt zur Ansteuerung eines LCDs über TWI überhaupt 
Interrupts?! Wenn ja, WOFÜR?!?!?!

Gruüße

der Praktikant

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermutlich brauchst Du keine Interrupts, aber ohne den Typ des LCDs zu 
kennen kann das niemand beantworten. (Würde aber nur Sinn machen wenn 
das Display Daten senden will z. B. bei einem Touchdisplay)

Und wer hat überhaupt etwas von Interrupts erzählt?

Autor: Philip Kottmann (praktikant)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit den Interrupts war eine allgemeine Frage. Habe das öfters im 
Bezug auf TWI gelesen und konnte mir eben auch nicht erklären, welches 
Erignis überhaupt einen Interrupt auslösen könnte....

Die Erläuterungen im Forum auf www.at91.com unter dem Stichwort "TWI 
working" versuche ich gerade noch zu verstehen......huihuihui.....

Gruß

der Praktikant

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.