Dark_Soul Postat Ianuarie 5, 2009 Partajează Postat Ianuarie 5, 2009 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 Link spre comentariu
danzup Postat Ianuarie 7, 2009 Partajează Postat Ianuarie 7, 2009 Daca postezi o schema te ajut cu mare placere !In Bascom programul .... Link spre comentariu
Dark_Soul Postat Ianuarie 7, 2009 Autor Partajează Postat Ianuarie 7, 2009 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
danzup Postat Ianuarie 8, 2009 Partajează Postat Ianuarie 8, 2009 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
Dark_Soul Postat Ianuarie 8, 2009 Autor Partajează Postat Ianuarie 8, 2009 nu stiu ce e Bascom.. Link spre comentariu
danzup Postat Ianuarie 8, 2009 Partajează Postat Ianuarie 8, 2009 BasicCompilator pentru Atmel AVR http://www.mcselec.com/ si este un download free la ultima versiune de bascom Link spre comentariu
Dark_Soul Postat Ianuarie 8, 2009 Autor Partajează Postat Ianuarie 8, 2009 pai cred ca e ok daca scoate hex si il pot pune pe CEREBOT, nu? Link spre comentariu
danzup Postat Ianuarie 8, 2009 Partajează Postat Ianuarie 8, 2009 pai cred ca e ok daca scoate hex si il pot pune pe CEREBOT, nu?Da.Dar nu pune baza mare in mine , ca stau extrem de prost cu timpul !Printre picaturi te ajut.... Link spre comentariu
danzup Postat Ianuarie 8, 2009 Partajează Postat Ianuarie 8, 2009 interfatare atmega / 7 segmente Link spre comentariu
Dark_Soul Postat Ianuarie 8, 2009 Autor Partajează Postat Ianuarie 8, 2009 Atmega64 e cipul, da placa de dezvoltare e CEREBOT... Link spre comentariu
danzup Postat Ianuarie 8, 2009 Partajează Postat Ianuarie 8, 2009 Pai si care e problema ?Ai scoase la conectoare pinii lui atmega64 ! Link spre comentariu
Dark_Soul Postat Ianuarie 8, 2009 Autor Partajează Postat Ianuarie 8, 2009 da , mai trebe sa retusez codul... nu ai ceva cod similar in bascom? Link spre comentariu
danzup Postat Ianuarie 8, 2009 Partajează Postat Ianuarie 8, 2009 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
Dark_Soul Postat Ianuarie 8, 2009 Autor Partajează Postat Ianuarie 8, 2009 bun, da ce limbaj e BASCOM? un fel de.... C? Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum