transmission RS232

Pour toutes vos questions sur CodeVision et la programmation en C en général

Modérateur : Modérateur

JP
Administrateur
Administrateur
Messages : 2323
Inscription : 23 sept. 2003 18:14
Localisation : Strasbourg
Contact :

Message par JP »

Tu configures correctement ton convertisseur analogique numérique (sur 8 bits) et ton UART.

Ensuite:

Code : Tout sélectionner

putchar(read_adc(0));  
Si tu as une erreur, il faudra peut être convertir le type comme ça :

Code : Tout sélectionner

putchar((char) read_adc(0));  

Invité

Message par Invité »

le probleme c'est que j'utilise un CAN 12bit externe au pic est qui fonctionne en liaison SPI je me trompe peut etre mais ce que tu me dis c'est pour le CAN interne non??

JP
Administrateur
Administrateur
Messages : 2323
Inscription : 23 sept. 2003 18:14
Localisation : Strasbourg
Contact :

Message par JP »

au pic
Je crois tu confonds PIC et AVR
PIC = famille de microcontrôleurs de Microchip
AVR = famille de microcontrôleurs d'Atmel
le probleme c'est que j'utilise un CAN 12bit externe au pic est qui fonctionne en liaison SPI je me trompe peut etre mais ce que tu me dis c'est pour le CAN interne non??
Effectivement, je pensais que tu parlais du CAN interne.
Enfin la démarche n'est pas vraiment différente.
Tu récupères la valeur que tu reçois sur le bus SPI.
Puisqu'elle est en 12bits tu la découpes en 2 (comme ADCL et ADCH pour le CAN interne) et tu envoies par l'uart les 2 paquets.

Invité

Message par Invité »

oui tu as raison je confond les 2 mais je ne connais pas les atmel je ne travaillais que sur microship.
par contre ce que je voulais savoir c'est comment je fais pour intitialiser le SPI sur l AVR je te remerci vraiment pour ton aide

JP
Administrateur
Administrateur
Messages : 2323
Inscription : 23 sept. 2003 18:14
Localisation : Strasbourg
Contact :

Message par JP »

Alors le SPI je ne l'ai jamais utilisé par contre j'ai trouvé ça dans l'aide de Codevision :

Code : Tout sélectionner

/* 
   Digital voltmeter using an
   Analog Devices AD7896 ADC
   connected to an AT90S8515
   using the SPI bus 

   Chip: AT90S8515
   Memory Model: SMALL
   Data Stack Size: 128 bytes
   Clock frequency: 4MHz  

   AD7896 connections to the AT90S8515   

   [AD7896]  [AT9S8515 DIP40]

    1 Vin
    2 Vref=5V
    3 AGND  - 20 GND
    4 SCLK  - 8  SCK
    5 SDATA - 7  MISO
    6 DGND  - 20 GND
    7 CONVST- 2  PB1
    8 BUSY  - 1  PB0

   Use an 2x16 alphanumeric LCD connected
   to PORTC as follows:
  [LCD]   [AT90S8515 DIP40]
   1 GND- 20 GND
   2 +5V- 40 VCC
   3 VLC
   4 RS - 21 PC0
   5 RD - 22 PC1
   6 EN - 23 PC2
  11 D4 - 25 PC4
  12 D5 - 26 PC5
  13 D6 - 27 PC6
  14 D7 - 28 PC7 */
#asm
    .equ __lcd_port=0x15

#endasm
#include <lcd.h> // LCD driver routines
#include <spi.h> // SPI driver routine
#include <90s8515.h>
#include <stdio.h>
#include <delay.h>

// AD7896 reference voltage [mV]
#define VREF 5000L

// AD7896 control signals PORTB bit allocation
#define ADC_BUSY PINB.0
#define NCONVST PORTB.1

// LCD display buffer
char lcd_buffer[33];
unsigned read_adc(void)
{
unsigned result;
// start conversion in mode 1
// (high sampling performance)
NCONVST=0;
NCONVST=1;
// wait for the conversion to complete
while (ADC_BUSY);
// read the MSB using SPI
result=(unsigned) spi(0)<<8;
// read the LSB using SPI and combine with MSB
result|=spi(0);
// calculate the voltage in [mV]
result=(unsigned) (((unsigned long) result*VREF)/4096L);
// return the measured voltage
return result;
}

void main(void)
{
// initialize PORTB
// PB.0 input from AD7896 BUSY
// PB.1 output to AD7896 /CONVST
// PB.2 & PB.3 inputs
// PB.4 output (SPI /SS pin)
// PB.5 input
// PB.6 input (SPI MISO)
// PB.7 output to AD7896 SCLK
DDRB=0x92;
// initialize the SPI in master mode
// no interrupts, MSB first, clock phase negative
// SCK low when idle, clock phase=0
// SCK=fxtal/4
SPCR=0x54;
// the AD7896 will work in mode 1
// (high sampling performance)
// /CONVST=1, SCLK=0
PORTB=2;
// initialize the LCD
lcd_init(16);
lcd_putsf("AD7896 SPI bus\nVoltmeter");
delay_ms(2000);
lcd_clear();
// read and display the ADC input voltage
while (1)
      {
      sprintf(lcd_buffer,"Uadc=%4umV",read_adc());
      lcd_clear();
      lcd_puts(lcd_buffer);
      delay_ms(100);
      };
}
Ca doit être une bonne base pour ce que tu veux faire.

Apres pour la configuration des registres du SPI, tu peux utiliser le "CodeWizardAVR" de CodeVision, choisis les différents paramètres de ton bus SPI, fait un preview pour avoir la valeur des différents registres de configuration et le tour est joué :)

Invité

Message par Invité »

bein je te remerci bocoup pour ton aide j'aime vraiment pas bosser sur des atmel c pas mon truc je prefere microship je trouve ca plus kler.
mé jai pas le choix on veut ke je fasse ca sur un atmel alors je le fais mais merci en tout cas bye

pipieee

Message par pipieee »

dis moi JP je voulais savoir si tu ne connais pas des fois la commande pour aller lire sur le SPI et celle pour ecrire je te remercie

JP
Administrateur
Administrateur
Messages : 2323
Inscription : 23 sept. 2003 18:14
Localisation : Strasbourg
Contact :

Message par JP »

Elle n'a pas changé depuis l'exemple :D
C'est toujours :

Code : Tout sélectionner

unsigned char spi(unsigned char data)
Elle sert à envoyer et recevoir un octet.
En fait, elle fait l'envoi et la réception en même temps.

Invité

Message par Invité »

merci pour ta reponse mais je ne comprend pas je n'ai rien qui fonctionne je n'arrive pas a savoir si j'ai mal configurer mon CAN ou si c'est mon micro ou mes cablages mais c'est la merde je suis en GROSSE galère.
j'envoi une premiere trame de config a mon CAN mais je ne sais meme pas s'il la recoit et ensuite il est censé me renvoyer des valeurs mais je n'est rien alors je ne sais plus quoi faire

Répondre