User Tools

Site Tools


max6675_atmega644

Interfacer un MAX6675 à un Atmega644

Actuellement, on trouve peu (pas ?) d'exemples sur internet sur comment interfacer un MAX6675 à un Atmega644 (ca marche aussi avec un Attiny2313, Atmega88, etc…) en langage C.

Cette page parlera de comment interfacer ce MAX6675 à un Atmega644 puis d'afficher la valeur captée par le Thermocouple sur un écran LCD 2×16.
En construction !

Une petite photo:

Sur le LCD, on a en haut la température (°C), en bas la température en binaire (ce qui a été transmis par SPI). On a ensuite en haut à gauche le MAX6675 au format SOIC (qui a été horrible à souder sur une stripboard à un pas de 2.54mm) puis en haut à droite l'Atmega644.

Et si quelqu'un veut le code:

main.c

/*
 * ----------------------------------------------------------------------------
 * "THE BEER-WARE LICENSE" (Revision 42):
 * <frank[ASCII:64]villaro-dixon.eu> wrote this file. As long as you retain this
 * notice, you can do whatever you want with this stuff. If we meet some day,
 * and you think this stuff is worth it, you can buy me a beer in return.
 * Frank Villaro-Dixon
 * ----------------------------------------------------------------------------
 */
 
 
 
/*
 * ----------------------------------------------------------------------------
 * Interface MAX6675 - Atmel AVR Atmega644
 * par le biais de SPI, protocole perso et crade :p, mais ca marche
 */
 
#define F_CPU 1000000UL
 
#define INPUT(register, pin) register &= ~(1<<pin)
#define OUTPUT(register, pin) register |= (1 << pin)
#define TURN_OFF(register, pin) register &= ~(1 << pin) //PORTx
#define TURN_ON(register, pin) register |= (1 << pin) //PORTx
 
 
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"
#include "autresFonctions.h"
 
 
 
 
#define SO PB0
#define SCK PB1
#define CS PB2
 
 
 
int main(void)
{
 
 
    char donneesSPI[16];
    char donneesSPITriees[13];
 
    unsigned long temperature = 25;
 
    char temperatureCHAR[] = "00000";
 
 
 
    int compteur = 0;
    int i = 0;
 
 
    OUTPUT(DDRA, CS);
    OUTPUT(DDRA, SCK);
    INPUT(DDRA, SO);
 
    lcd_init(LCD_DISP_ON);
    lcd_clrscr();
    lcd_puts("INIT");
 
    debut:
 
 
    temperature = 0;
    compteur++;
 
    fetchDataFromSPI(donneesSPI); //On demande au MAX6675 ses données
 
 
    donneesSPITriees[0] = donneesSPI[1];//On enlève de la trame que ce qui nous intéresse
    donneesSPITriees[1] = donneesSPI[2];
    donneesSPITriees[2] = donneesSPI[3];
    donneesSPITriees[3] = donneesSPI[4];
    donneesSPITriees[4] = donneesSPI[5];
    donneesSPITriees[5] = donneesSPI[6];
    donneesSPITriees[6] = donneesSPI[7];
    donneesSPITriees[7] = donneesSPI[8];
    donneesSPITriees[8] = donneesSPI[9];
    donneesSPITriees[9] = donneesSPI[10];
    donneesSPITriees[10] = donneesSPI[11];
    donneesSPITriees[11] = donneesSPI[12];
 
 
    lcd_clrscr();
 
    /*lcd_gotoxy(0,1);
    lcd_puts(donneesSPITriees);*/
 
 
 
    temperature = 0;
    //for (i = 0; donneesSPITriees[i] != '\0'; i++)
    for (i = 0; i < 12; i++)//On convertit en binaire(char) decimal(long)
    {
        temperature <<= 1;
        temperature |= (donneesSPITriees[i] - '0');
    }
 
 
    lcd_gotoxy(0,0);
    temperature = temperature/4+1;
    numtostring(temperature, temperatureCHAR, 3);
    //numtostring(compteur, temperatureCHAR, 1);
    lcd_puts("Temp: ");
    lcd_puts(temperatureCHAR);
    lcd_puts("C");
 
    //temperature = (temperature * 1023.0)/4096.0;
    lcd_gotoxy(0,1);
    lcd_puts(donneesSPITriees); //pour un debug
 
    /*lcd_gotoxy(0,1);
    lcd_puts(temperatureCHAR);*/
 
 
 
goto debut;
 
    return 0;
}

autresFonctions.c

#define F_CPU 1000000UL
 
#define INPUT(register, pin) register &= ~(1<<pin)
#define OUTPUT(register, pin) register |= (1 << pin)
#define TURN_OFF(register, pin) register &= ~(1 << pin) //PORTx
#define TURN_ON(register, pin) register |= (1 << pin) //PORTx
 
 
#include <avr/io.h>
#include <util/delay.h>
 
#define SO PB0
#define SCK PB1
#define CS PB2
 
 
/*void numtostring(unsigned long int temp, char numstring[]) //Convertir un int vers un char
{
 
    int x;
    for(x = 4; x >= 0 ;x--)
    {
        numstring[x] = (temp % 10) + 0x30;
        temp /= 10;
    }
}*/
 
 
void numtostring(unsigned long int temp, char numstring[], int x) //Convertir un int vers un char
{
 
    numstring[0] = ' ';
    numstring[1] = ' ';
    numstring[2] = ' ';
    numstring[3] = ' ';
    numstring[4] = ' ';
 
    for(; x >= 0 ;x--)
    {
        numstring[x] = (temp % 10) + 0x30;
        temp /= 10;
    }
}
 
void fetchDataFromSPI(char donneesSPI[])
{
    int compteur = 0;
    TURN_OFF(PORTA, SO); //Pas de pull-up
    TURN_OFF(PORTA, SCK); //Pas de clock
    TURN_ON(PORTA, CS); //Pas d'invitation a la transmission
    _delay_ms(1500); //On attend un peu
 
    TURN_OFF(PORTA, CS); //Allez, on va inviter le MAX6675 à commencer à transmettre
    _delay_ms(25); //On lui laisse le temps de faire la conversion (au MAX6675)
 
 
    while(compteur < 16) //Il nous balance ses données
        {
            TURN_ON(PORTA, SCK); //Clock en front haut
            _delay_ms(1); //On attend un peu
 
            if(bit_is_set(PINA, SO)) //Il nous envoie un 1 ?
                donneesSPI[compteur] = '1';
            else //Un 0
                donneesSPI[compteur] = '0';
 
            _delay_ms(1);
 
            TURN_OFF(PORTA, SCK); //Clock en front bas
            compteur++;
            _delay_ms(2); // 1+1 = 2
        }
 
}

Discussion

Enter your comment. Wiki syntax is allowed:
ZZIMQ
 
max6675_atmega644.txt · Last modified: 2011/12/26 20:51 (external edit)