Mega8 mit SPI und ads7843

Bonze

Neues Mitglied
16. Jan. 2010
516
0
0
Altenkirchen (Pfalz)
Sprachen
  1. BascomAVR
So, bin beim testen meiner Hardware, und bin dabei auch zum Touch gekommen,

hab ihn über ein 74 Ls 07 verbunden, mit Pullups zu 3,3V bzw 5V, (wie hier zu sehen http://mexlewiki.hs-heilbronn.de/UserFiles/File/sd_reader/Dokumentation.pdf)

jetzt hab ich aber das prob, das ich keine verbindung bekomme, die Spannung müssten soweit alle stimmen, liegen , zumindest im geforderten bereich,

mein Code sieht so aus,.

Code:
$regfile = "m8def.dat"
$crystal = 16000000                                         'Quarz: 3,6864 MHz
$baud = 9600

$hwstack = 100
$swstack = 100
$framesize = 100
'$sim

Dim Temp As Byte
Dim Spidata(4) As Byte
Dim Ergebniss As Integer
Dim Ergebniss_x As Integer
Dim Ergebniss_y As Integer
Dim Touch_x As Integer
Dim Touch_y As Integer

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 1 , Clockrate = 16 , Noss = 1
Spi_cs Alias Portb.2 : Ddrb.0 = 1                           'Config Spi_cs = Output  chipselect  SS-Pin
Spi_mosi Alias Portb.3
Spi_sdo Alias Portb.4                                       ' MISO-PIN
Spi_sck Alias Portb.5

Set Spi_cs
Spiinit

   Do

      Temp = &H93                                           '12bit  y
      Reset Spi_cs
      Spiout Temp , 1                                       'send 1 byte
      Spiin Spidata(1) , 1
      Spiin Spidata(2) , 1
      Set Spi_cs
      Temp = &HD3                                           '12bit  x
      Reset Spi_cs
      Spiout Temp , 1                                       'send 1 byte
      Spiin Spidata(3) , 1
      Spiin Spidata(4) , 1
      Set Spi_cs

     Ergebniss = Makeint(spidata(4) , Spidata(3))
     Ergebniss_x = 33000 - Ergebniss

     Ergebniss = Makeint(spidata(2) , Spidata(1))
     Ergebniss_y = 33000 - Ergebniss

   If Ergebniss_x <= 1331 Then                              '29820   93,1875
     Touch_x = 0
     Else
     Touch_x = Ergebniss_x / 93.1875
   End If

   If Ergebniss_y <= 1331 Then                              '29820   124,25
     Touch_y = 0
     Else
     Touch_y = Ergebniss_y / 124.25
   End If

   Print "x" ; Touch_x
   Print "y" ; Touch_y
   Waitms 100

   Loop
End


es geht mir darum rauszufinden ob das so funktioniert, oder ob es defekt ist oder, oder oder,... die werte müssen nicht 100%iog stimmen, hauptsache ich bekomme was zurück,..
BTw, mal noch ne verständnisfrage, CS ist SS, oder? also kann ich es so benutzen,
SS muss bei meinem Master (mega) high sein ?
oder muss ich Cs auf nen anderen pin legen, und 5V auf SS legen ?
 
Hi
Also, ich hab mir den Link angesehe, ein CS aber nicht entdeckt ? SS ist ein Portausgang, CS klingt nach Chip Select und könnte etwas anderes sein. Oft ist ein LOW-Signalan CS die Selektierung.
Gruß oldmax
 
Hi
Also, ich hab mir den Link angesehe, ein CS aber nicht entdeckt ? SS ist ein Portausgang, CS klingt nach Chip Select und könnte etwas anderes sein. Oft ist ein LOW-Signalan CS die Selektierung.
Gruß oldmax
Hallo,

also...

SS => Slave Select
CS => Chip Select
CE => Chip Enable
... usw
einfach mal versuchen die Buchstaben zu interpretieren.

SS ist glaube ich dafür da wenn der ATmega SPI-Slave spielen soll. Er wird
dadurch selektiert. CE heißt es bei manchen Chips damit sie die SPI-Daten
annehmen. Also im großen und ganze eine Sache mit 2 Namen.

Gruß
Dino
 
hab den spi halt noch garnich zum laufen gebracht, egal as ich gemacht hab ,.

hab das programm jetzt geladen, hab als cs pin Pb.0 und SS pin PB.1 eingestellt,.


sobald das programm geladen ist, bekomme ich keine ausgabe mehr über RS232,.

sehr komisch, gibts niocht ne ganz einfache methode den SPi zu testen ? hab , den ads controller,. die SD card,.. zum testen da,.

mein pro sieht so aus
Code:
$regfile = "m8def.dat"
$crystal = 16000000                                         'Quarz: 3,6864 MHz
$baud = 9600

$hwstack = 100
$swstack = 100
$framesize = 100
'$sim

Dim Temp As Byte
Dim Spidata(4) As Byte
Dim Ergebniss As Integer
Dim Ergebniss_x As Integer
Dim Ergebniss_y As Integer
Dim Touch_x As Integer
Dim Touch_y As Integer

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 1 , Clockrate = 128 , Noss = 1
Spi_cs Alias Portb.2 : Ddrb.0 = 1                           'Config Spi_cs = Output  chipselect  SS-Pin
Spi_mosi Alias Portb.3
Spi_sdo Alias Portb.4                                       ' MISO-PIN
Spi_sck Alias Portb.5

Set Spi_cs
Spiinit

   Do

      Temp = &H93                                           '12bit  y
      Reset Spi_cs
      Spiout Temp , 1                                       'send 1 byte
      Spiin Spidata(1) , 1
      Spiin Spidata(2) , 1
      Set Spi_cs
      Temp = &HD3                                           '12bit  x
      Reset Spi_cs
      Spiout Temp , 1                                       'send 1 byte
      Spiin Spidata(3) , 1
      Spiin Spidata(4) , 1
      Set Spi_cs

     Ergebniss = Makeint(spidata(4) , Spidata(3))
     Ergebniss_x = 33000 - Ergebniss

     Ergebniss = Makeint(spidata(2) , Spidata(1))
     Ergebniss_y = 33000 - Ergebniss

   If Ergebniss_x <= 1331 Then                              '29820   93,1875
     Touch_x = 0
     Else
     Touch_x = Ergebniss_x / 93.1875
   End If

   If Ergebniss_y <= 1331 Then                              '29820   124,25
     Touch_y = 0
     Else
     Touch_y = Ergebniss_y / 124.25
   End If

   Print "x" ; Touch_x
   Print "y" ; Touch_y
   Waitms 100

   Loop
End
 
Hallo,

also...

SS => Slave Select
CS => Chip Select
CE => Chip Enable
... usw
einfach mal versuchen die Buchstaben zu interpretieren.

SS ist glaube ich dafür da wenn der ATmega SPI-Slave spielen soll. Er wird
dadurch selektiert. CE heißt es bei manchen Chips damit sie die SPI-Daten
annehmen. Also im großen und ganze eine Sache mit 2 Namen.

Gruß
Dino

Hallo zusammen!

Wollte nur einen Tipp geben:

/SS steht für Slave-Select. Dieses Signal ist low-aktiv. Damit selektiert der Master mehrere Slaves am SPI-Bus - falls mehrere vorhandensein sollten.
Beachte, dass nicht selektierte SPI-Devices hochohmig geschaltet sind.

Gruß

FreeVee
 
Hallo zusammen!

Wollte nur einen Tipp geben:

/SS steht für Slave-Select. Dieses Signal ist low-aktiv. Damit selektiert der Master mehrere Slaves am SPI-Bus - falls mehrere vorhandensein sollten.
Beachte, dass nicht selektierte SPI-Devices hochohmig geschaltet sind.

Gruß

FreeVee

Hallo zusammen!

So jetzt habe ich über meinen zuvor abgegebenen Tipp noch einmal nachgedacht. Sportschau schauen und nebenbei im Forum schreiben passte wohl nicht zusammen. Irgendwie ist da bei mir etwas schief gelaufen...
Bei SPI ist es so wie Dino es schon geschrieben hatte. Das SS-Signal wird beim AVR nur dann benötigt, wenn er als Slave arbeiten soll.

Allgemeines zum SPI:
Der Master selektiert den bzw. die Slaves über irgendeinen Port (dieser muss zuvor selbstverständlich als Augang initalisiert sein). Jeder Slave wird mit einem eigenen Port des Masters verbunden.
Der Master gibt auf der SCK-Leitung den Takt für die Datenübertragung aus und sendet synchron zum Takt die Datenbits auf dem Pin MOSI (MasterOutSlaveIn). Gleichzeitig sendet der Slave seine Datenbits auf dem Pin MISO (MasterInSlaveOut). Es antwortet NUR der Slave, dessen /SS-Pin vom Master zuvor aktiviert wurde. Bei allen anderen Slaves bleiben die SPI-Pins hochohmig. Das ganze ist also wie ein Schieberegister zu sehen.

Noch etwas:
Wenn nur ein Master und ein Slave miteinander kommunizieren, kann die SS-Leitung entfallen.
Es ist außerdem möglich auf die MISO-Leitung zu verzichten. Nämlich dann, wenn nur Daten vom Master zum Slave übertragen werden sollen. Da fällt mir spontan eine Anwendung ein, die ich mal vor ein paar Wochen hatte. Musste ein EADOGM-LCD via SPI ansteuern, da ich nur noch wenige Ports frei hatte.

Weiterhin ist es auch möglich, mehrere Teilnehmer abwechselnd als Master zu betreiben - aber niemals gleichzeitig.

Hoffe nun meinen "Tipp" richtiggestellt zu haben.

Noch etwas (einen habe ich noch):
Hast Du die Datenorder MSB bzw. LSB first entsprechend dem Datenblatt eingestellt? Hatte dies auch mal falsch gemacht - kleiner Fehler - große Wirkung.

Gruß

FreeVee
 
das komische ist , ich bekomme nich mal ne sd card zum laufen, werd jetzt mal die sd card mit nem 1284 testen , um zu sehen ob meine Spi schaltung überhaupt funktioniert,.
 
so mein code sieht so aus, ich bekomme als ausgabe nur 255....
SpI sollte eigentlich funktinieren
Code:
$regfile = "m8def.dat"
$crystal = 16000000                                        
$baud = 19200

$hwstack = 32
$swstack = 10
$framesize = 40
'$sim

Dim Temp As Byte
Dim Spidata(4) As Byte
Dim Ergebniss As Integer
Dim Ergebniss_x As Integer
Dim Ergebniss_y As Integer
Dim Touch_x As Integer
Dim Touch_y As Integer

Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Input
Config Portb.5 = Output
'cpHA = 0
'cpol = 1
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 1 , Clockrate = 128 , Noss = 1
Spi_cs Alias Portb.2 : Ddrb.0 = 1                           'Config Spi_cs = Output  chipselect  SS-Pin
Spi_sdo Alias Pinb.4                                        ' MISO-PIN
Set Spi_cs
Spiinit
Do

      'X auslesen &H93 10010011
      Temp = &B[B]10010000 [/B]                                    '12bit  y
      Reset Spi_cs

      Spiout Temp , 1                                       'send 1 byte
      Waitms 5
      Spiin Spidata(1) , 1                                  'x byte 1 MSB
      Print "data 1 " ; Spidata(1)
      Spiin Spidata(2) , 1                                  'x byte 2 LSB
      Print "data 2 " ; Spidata(2)

      'y auslesen &Hd3 11010011
      Set Spi_cs

      Temp = &B[B]11010000  [/B]                                   '12bit  x
      Reset Spi_cs

      Spiout Temp , 1                                       'send 1 byte
      Waitms 5
      Spiin Spidata(3) , 1                                  'y byte 1 MSB
      Print "data 3 " ; Spidata(3)
      Spiin Spidata(4) , 1                                  'y byte 2 LSB
      Print "data 4 " ; Spidata(4)
      Set Spi_cs

     Ergebniss = Makeint(spidata(4) , Spidata(3))
     Ergebniss_x = 33000 - Ergebniss
      Print "X: " ; Ergebniss_x
     Ergebniss = Makeint(spidata(2) , Spidata(1))
     Ergebniss_y = 33000 - Ergebniss
     Print "Y: " ; Ergebniss_y
   'If Ergebniss_x <= 1331 Then                              '29820   93,1875
   '  Touch_x = 0
   '  Else
   '  Touch_x = Ergebniss_x / 93.1875
  ' End If

  ' If Ergebniss_y <= 1331 Then                              '29820   124,25
  '   Touch_y = 0
  '   Else
   '  Touch_y = Ergebniss_y / 124.25
  ' End If

  ' Print "x" ; Touch_x
  ' Print "y" ; Touch_y
   Waitms 100
      Loop
End


Hab jetzt auch noch den C code, beispielcode der chinesen,.
Code:
'void WriteCharTo7843(unsigned char num)          //SPIдÊý¾Ý
'{
'unsigned char count=0;
'DCLK=0;
'for(count=0;count<8;count++)
'{
'num<<=1;
'DIN=CY;
'DCLK=0; _nop_();_nop_();_nop_();                //ÉÏÉýÑØÓÐЧ
'DCLK=1; _nop_();_nop_();_nop_();
'}
'}
'//**********************************************************
'unsigned int ReadFromCharFrom7843()             //SPI ¶ÁÊý¾Ý
'{
'unsigned char count=0;
'unsigned int Num=0;
'for(count=0;count<12;count++)
'{
'Num<<=1;
'DCLK=1; _nop_();_nop_();_nop_();                //ϽµÑØÓÐЧ
'DCLK=0; _nop_();_nop_();_nop_();
'if(DOUT) Num++;
'}
'return(Num);
'}
'############################################################
'void AD7843(void)              //ÍⲿÖжÏ0 ÓÃÀ´½ÓÊܼüÅÌ·¢À´µÄÊý¾Ý
'{
' CS=0;
'delayms(1);                     //ÖжϺóÑÓʱÒÔÏû³ý¶¶¶¯£¬Ê¹µÃ²ÉÑùÊý¾Ý¸ü׼ȷ
'//while(BUSY);                //Èç¹ûBUSYÐźŲ»ºÃʹ¿ÉÒÔɾ³ý²»ÓÃ
'delayms(1);
'WriteCharTo7843([B]0x90[/B]);        //ËÍ¿ØÖÆ×Ö [B]10010000[/B] ¼´Óòî·Ö·½Ê½¶ÁX×ø±ê ÏêϸÇë¼ûÓйØ×ÊÁÏ
'//while(BUSY);               //Èç¹ûBUSYÐźŲ»ºÃʹ¿ÉÒÔɾ³ý²»ÓÃ
'delayms(1);
'DCLK=1; _nop_();_nop_();_nop_();_nop_();
'DCLK=0; _nop_();_nop_();_nop_();_nop_();
'TP_Y=ReadFromCharFrom7843();
'WriteCharTo7843(0x[B]D0[/B]);       //ËÍ¿ØÖÆ×Ö [B]11010000[/B] ¼´Óòî·Ö·½Ê½¶ÁY×ø±ê ÏêϸÇë¼ûÓйØ×ÊÁÏ
'DCLK=1; _nop_();_nop_();_nop_();_nop_();
''DCLK=0; _nop_();_nop_();_nop_();_nop_();
'TP_X=ReadFromCharFrom7843();
'CS=1;
'}
'while(1)
' {
'  if ([B][I]IRQ==0[/I][/B])
'  {
'   AD7843();
'   inttostr(TP_X,ss);
'   showzifustr(10,305,"X:",0xf800,0xffff);
'   showzifustr(25,305,ss,0xf800,0xffff); //ÏÔʾ×Ö·û´®
'   inttostr(TP_Y,ss);
'   showzifustr(80,305,"Y:",0xf800,0xffff);
'   showzifustr(95,305,ss,0xf800,0xffff); //ÏÔʾ×Ö·û´®
'   lx=240-((TP_X-220)/14);
'   ly=320-((TP_Y-300)/11);
'
'   for(k=0;k<5;k++)
'   {
'       for(h=0;h<5;h++)
'    {
'      Address_set(lx+h,ly+k,lx+1,ly+1);
'            LCD_Write_DATA(0x6666>>8,0x6666);
'     }
'   }
'
'  }
'
'    }

Die chinesen benutzen halt den PirQ und den Busy ausgang des Ads7843, welche ich nicht benutze vielleicht istdas auch der fehler, das der Chip einfach nen Moment braucht um ein ergbnis zu liefern. und wegen meinem Takt von 16Mhz einfach zu schnell ist.? oder meint ihr das kann nicht sein ?

Hab mal versucht dieleitungen direkt auszuwerten,
das scheint zu funktionieren,..
 
also , so langsam denke ich , ich bin blöd, hab jetzt den Pen_q ausgang abgefragt, und den Busy, wenn ich aufs Touch drücke, wird Pen_q = 0, dann sollte meine auswertung eigentlich erst loslaufen, jedoch läuft es immer?! Meine Schaltung sollte eigentlich funktionieren,

schau ich mir die empfangenen Daten an, dann bekomme ich immer 255 als ausgabe, ziehe ich die leitungen ab bekomme ich 0,

bin noch am verzweifeln, ich denke langsam daran, das
a) der ads7843 controller hinnüber ist

b) meine leitungen zu lange sind und deshalb nur dumme zeug ankommt, könnte das sein ?
ich benutze flachbandkabel,. diese sind 2 mal 30cm lang, d.h. das erste vom experimentierboard an mein breadboard, und von dort dann an mein display,auf dem bread board ist ja mein level shifter , also denk ich mal sind nur einmal 30cm anzurechnen ...

c) kommunikation ist viel zu schnell, denn 16Mhz/125khz =128, und da steht im datasheet up to 125Khz,. besser wär wahrscheinlich bisschen langsamer,.


µC<---- 30cm ----> 74LS07 <---- 30cm ----> ads7843

Code:
Dim Temp As Byte
Dim Spidata(4) As Byte
Dim Ergebniss As Integer
Dim Ergebniss_x As Integer
Dim Ergebniss_y As Integer
Dim Touch_x As Integer
Dim Touch_y As Integer

Config Portb.0 = Input
Config Portb.1 = Input
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Input
Config Portb.5 = Output


Config Portd.5 = Output
Config Portd.6 = Output
Led1 Alias Portd.5                                          'Pirq anzeige
Led2 Alias Portd.6                                          'Busy anzeige
Ddrb.2 = 1   'Config Spi_cs = Output


'cpHA = 0
'cpol = 1
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 1 , Clockrate = 128 , Noss = 1
Pen_q Alias Portb.0                                         'Pen Interrupt
Busy Alias Portb.1                                          'Busy Output
Spi_cs Alias Portb.2                                        'SS-Pin
Spi_sdo Alias Portb.4                                       'MISO-PIN

Set Spi_cs
Spiinit

   Do
      If Pen_q = 0 Then                                     'bei interrupt ausführen
         Reset Led1
        'X auslesen &H93 10010011
        Temp = &B10010011                                   '12bit  y
        Reset Spi_cs

        Spiout Temp , 1                                     'send 1. byte von Temp

        Spiin Spidata(1) , 1                                  'x byte 1 MSB
        Print "data 1 " ; Spidata(1)
        Spiin Spidata(2) , 1                                  'x byte 2 LSB
        Print "data 2 " ; Spidata(2)

        'y auslesen &Hd3 11010011
        Set Spi_cs

        Temp = &B11010011                                   '12bit  x
        Reset Spi_cs

        Spiout Temp , 1                                     'send 1. byte von Temp

        Spiin Spidata(3) , 1                                  'y byte 1 MSB
        Print "data 3 " ; Spidata(3)
        Spiin Spidata(4) , 1                                  'y byte 2 LSB
        Print "data 4 " ; Spidata(4)
        Set Spi_cs

        Ergebniss = Makeint(spidata(4) , Spidata(3))
        Ergebniss_x = 33000 - Ergebniss
        Print "X: " ; Ergebniss_x
        Ergebniss = Makeint(spidata(2) , Spidata(1))
        Ergebniss_y = 33000 - Ergebniss
        Print "Y: " ; Ergebniss_y

        Waitms 100
      Else
         Set Led1
      End If

      If Busy = 0 Then                                      '
         Set Led2
      Else
         Reset Led2
      End If
  Loop
End

mit internem 8MHz takt läufts auch ned,.

der code muss eigentlich stimmen, sowie die verkablung,. kann doch nich ein das der controller defekt is,.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)