Sari la conținut
ELFORUM - Forumul electronistilor

programare Cerebot ATmega64


Dark_Soul

Postări Recomandate

Salutare. La Multi Ani.Am doi foto tranzistori fiecare in fata la cate un led galben care e tot timpu aprins. Cele 2 iesiri (colector) al fototranzistorilor(in functie de starea fototranzistorului deschis sau inchis) trebuie sa le leg la cate un port de intrare in Cerebot. Problema e ca nu stiu sa construiesc programul in AVR, nu am nici o idee cum ar trebui inceput.Programul trebuie sa contorizeze starile de H sau L pe cele 2 porturi, si sa afiseze pe ecran de cate ori sa intrerupt primul fototranzistor, si de cate ori cel de al doilea.Daca cineva de pe forum a facut acest proiect, sau are idee de ce si cum, il rog frumos sa ma ajute. Nu raman dator :d

Link spre comentariu
  • Răspunsuri 18
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Dark_Soul

    10

  • danzup

    8

Codul:

main.c

 

#include <avr/io.h>#include <avr/interrupt.h>#include "lcd.h"void EXT_INT0_init(void);void HexConvert(unsigned char cnt);unsigned volatile char flag,cnt0,cnt1;unsigned char hundr,tens,ones;unsigned char array0[]={"INT0:"};unsigned char array1[]={"INT1:"};unsigned char array2[]={"Total:"};ISR(INT0_vect){   flag = 0x01;   cnt0++;}ISR(INT1_vect){   flag = 0x02;   cnt1++;}int main(void){   flag = 0x00;      cnt0 = 0x00;   cnt1 = 0x00;   SREG |= 0x80;      EXT_INT0_init();   LCDinit();   LCDclr();   while(1)   {      if(flag==0x01)      {         LCDGotoXY(0,0);         LCDstring(array0,5);                  HexConvert(cnt0);         LCDsendChar(hundr);         LCDsendChar(tens);         LCDsendChar(ones);         flag = 0x00;      }      else if(flag==0x02)      {         LCDGotoXY(0,1);         LCDstring(array1,5);                     HexConvert(cnt1);               LCDsendChar(hundr);         LCDsendChar(tens);         LCDsendChar(ones);         flag = 0x00;      }      else      {         LCDGotoXY(0,3);         LCDstring(array2,6);                  HexConvert((cnt0+cnt1));            LCDsendChar(hundr);         LCDsendChar(tens);         LCDsendChar(ones);      }   }   return 0;}void EXT_INT0_init(void){   MCUCR = (1<<ISC11)|(1<<ISC01);      GICR = (1<<INT1)|(1<<INT0); //enable external interrup 0 and 1         }void HexConvert(unsigned char cnt){   unsigned char dec,high,low;   high = (cnt>>4);   low = (cnt&0x0F);      dec = (high*16) + low;      hundr = dec/100;      ones = dec%10;   tens = ((dec%100)-ones)/10;   hundr |= 0x30;      tens |= 0x30;      ones |= 0x30;} 

lcd.c

 

#include "lcd.h"#include <inttypes.h>#include <avr/io.h>#include <avr/pgmspace.h>#include <util/delay.h>void LCDsendChar(uint8_t ch)      {   LDP=(ch&0b11110000);   LCP|=1<<LCD_RS;   LCP|=1<<LCD_E;         _delay_ms(1);   LCP&=~(1<<LCD_E);      LCP&=~(1<<LCD_RS);   _delay_ms(1);   LDP=((ch&0b00001111)<<4);   LCP|=1<<LCD_RS;   LCP|=1<<LCD_E;         _delay_ms(1);   LCP&=~(1<<LCD_E);      LCP&=~(1<<LCD_RS);   _delay_ms(1);}void LCDsendCommand(uint8_t cmd)   {   LDP=(cmd&0b11110000);   LCP|=1<<LCD_E;         _delay_ms(1);   LCP&=~(1<<LCD_E);   _delay_ms(1);   LDP=((cmd&0b00001111)<<4);      LCP|=1<<LCD_E;         _delay_ms(1);   LCP&=~(1<<LCD_E);   _delay_ms(1);}void LCDinit(void)                   // Initializare LCD{   _delay_ms(15);   LDP=0x00;   LCP=0x00;   LDDR|=1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4;   LCDR|=1<<LCD_E|1<<LCD_RS;   LDP=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|1<<LCD_D4;   LCP|=1<<LCD_E|0<<LCD_RS;         _delay_ms(1);   LCP&=~(1<<LCD_E);   _delay_ms(1);   LDP=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|1<<LCD_D4;   LCP|=1<<LCD_E|0<<LCD_RS;         _delay_ms(1);   LCP&=~(1<<LCD_E);   _delay_ms(1);   LDP=0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|0<<LCD_D4;   LCP|=1<<LCD_E|0<<LCD_RS;         _delay_ms(1);   LCP&=~(1<<LCD_E);   _delay_ms(1);   LCDsendCommand(0b00101000);   // incrementare adresa, schimbare pozitie cursor   LCDsendCommand(0b00001110);}         void LCDclr(void)            // Stergere tot de pe LCD{   LCDsendCommand(1<<LCD_CLR);}void LCDhome(void)         // cursor spre inceput{   LCDsendCommand(1<<LCD_HOME);}void LCDstring(uint8_t* data, uint8_t nBytes)   {register uint8_t i;   if (!data) return;   for(i=0; i<nBytes; i++)   {      LCDsendChar(data[i]);   }}void LCDGotoXY(uint8_t x, uint8_t y)   //Cursor pe pozitia X Y{   register uint8_t DDRAMAddr;   switch(y)   {   case 0: DDRAMAddr = LCD_LINE0_DDRAMADDR+x; break;   case 1: DDRAMAddr = LCD_LINE1_DDRAMADDR+x; break;   case 2: DDRAMAddr = LCD_LINE2_DDRAMADDR+x; break;   case 3: DDRAMAddr = LCD_LINE3_DDRAMADDR+x; break;   default: DDRAMAddr = LCD_LINE0_DDRAMADDR+x;   }   LCDsendCommand(1<<LCD_DDRAM | DDRAMAddr);   }   void CopyStringtoLCD(const uint8_t *FlashLoc, uint8_t x, uint8_t y){   uint8_t i;   LCDGotoXY(x,y);   for(i=0;(uint8_t)pgm_read_byte(&FlashLoc[i]);i++)   {      LCDsendChar((uint8_t)pgm_read_byte(&FlashLoc[i]));   }}void LCDdefinechar(const uint8_t *pc,uint8_t char_code){   uint8_t a, pcc;   uint16_t i;   a=(char_code<<3)|0x40;   for (i=0; i<8; i++){      pcc=pgm_read_byte(&pc[i]);      LCDsendCommand(a++);      LCDsendChar(pcc);      }}void LCDcursorOn(void){   LCDsendCommand(0x0E);}void LCDcursorOnBlink(void)   {   LCDsendCommand(0x0F);}void LCDcursorOFF(void)   {   LCDsendCommand(0x0C);}void LCDblank(void)      {   LCDsendCommand(0x08);}void LCDvisible(void)      {   LCDsendCommand(0x0C);}

lcd.h

 

#ifndef LCD_H#define LCD_H#include <inttypes.h>//#define LCD_RW   1    //define MCU pin connected to LCD R/W#define LCD_RS   0    //define MCU pin connected to LCD RS#define LCD_E   1   //define MCU pin connected to LCD E#define LCD_D4   4   //define MCU pin connected to LCD D3#define LCD_D5   5   //define MCU pin connected to LCD D4#define LCD_D6   6   //define MCU pin connected to LCD D5#define LCD_D7   7   //define MCU pin connected to LCD D6#define LDP PORTD   //define MCU port connected to LCD data pins#define LCP PORTD   //define MCU port connected to LCD control pins#define LDDR DDRD   //define MCU direction register for port connected to LCD data pins#define LCDR DDRD   //define MCU direction register for port connected to LCD control pins#define LCD_CLR             0   //DB0: clear display#define LCD_HOME            1   //DB1: return to home position#define LCD_ENTRY_MODE      2   //DB2: set entry mode#define LCD_ENTRY_INC       1   //DB1: increment#define LCD_ENTRY_SHIFT     0   //DB2: shift#define LCD_ON_CTRL         3   //DB3: turn lcd/cursor on#define LCD_ON_DISPLAY      2   //DB2: turn display on#define LCD_ON_CURSOR       1   //DB1: turn cursor on#define LCD_ON_BLINK        0   //DB0: blinking cursor#define LCD_MOVE            4   //DB4: move cursor/display#define LCD_MOVE_DISP       3   //DB3: move display (0-> move cursor)#define LCD_MOVE_RIGHT      2   //DB2: move right (0-> left)#define LCD_FUNCTION        5   //DB5: function set#define LCD_FUNCTION_8BIT   4   //DB4: set 8BIT mode (0->4BIT mode)#define LCD_FUNCTION_2LINES 3   //DB3: two lines (0->one line)#define LCD_FUNCTION_10DOTS 2   //DB2: 5x10 font (0->5x7 font)#define LCD_CGRAM           6   //DB6: set CG RAM address#define LCD_DDRAM           7   //DB7: set DD RAM address// reading:#define LCD_BUSY            7   //DB7: LCD is busy#define LCD_LINES         2   //visible lines#define LCD_LINE_LENGTH      16   //line length (in characters)// cursor position to DDRAM mapping#define LCD_LINE0_DDRAMADDR      0x00#define LCD_LINE1_DDRAMADDR      0x40#define LCD_LINE2_DDRAMADDR      0x14#define LCD_LINE3_DDRAMADDR      0x54void LCDsendChar(uint8_t);      //forms data ready to send to 74HC164void LCDsendCommand(uint8_t);   //forms data ready to send to 74HC164void LCDinit(void);         //Initializes LCDvoid LCDclr(void);            //Clears LCDvoid LCDhome(void);         //LCD cursor homevoid LCDstring(uint8_t*, uint8_t);   //Outputs string to LCDvoid LCDGotoXY(uint8_t, uint8_t);   //Cursor to X Y positionvoid CopyStringtoLCD(const uint8_t*, uint8_t, uint8_t);//copies flash string to LCD at x,yvoid LCDdefinechar(const uint8_t *,uint8_t);//write char to LCD CGRAMvoid LCDshiftRight(uint8_t);   //shift by n characters Rightvoid LCDshiftLeft(uint8_t);   //shift by n characters Leftvoid LCDcursorOn(void);      //Underline cursor ONvoid LCDcursorOnBlink(void);   //Underline blinking cursor ONvoid LCDcursorOFF(void);      //Cursor OFFvoid LCDblank(void);         //LCD blank but not clearedvoid LCDvisible(void);         //LCD visiblevoid LCDcursorLeft(uint8_t);   //Shift cursor left by nvoid LCDcursorRight(uint8_t);   //shif cursor right by n#endif 

nu cred ca mai folosesc LCD, mai bine folosesc afisajul cu segmente cu 8 pini

nu stiu daca e bun codul pe care il am...

Link spre comentariu

Codul care l-ai postat e pentru LCD .Pentru afisaj cu LED cu 7 segmente trebuie rescris partea de afisare , si ti-as recomanda 2 decodoare BCD/7 segmente pentru ca overheadul afisarii s-ar putea sa-ti lase putin timp microcontroler pentru altceva la robot care trebuie sa reactioneze totusi in timp real .Cunosc programare in C dar nu te pot ajuta pentru ca nu sunt un profesionist in C.Dupa cum am zis in Bascom pot sa te ajut .

Link spre comentariu

Ba da! Am sa-ti dau codul in Bascom pe care l-am scris pentru o aplicatie cu 2 digiti LED 7 segmente.Cand ajung deseara acasa . O sa postez aici ....mai bine inveti Bascom pentru ca poti face absolut totul ce faci si cu Asm si cu C .Cum spuneam : nu conteaza pe unde mergi important e sa ajungi ok la capatul drumului in acelasi timp cu ceilalti .

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări