C-ből Bascomba!

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00
Tartózkodási hely: Szolnok

C-ből Bascomba!

HozzászólásSzerző: dummy » 2009. március 29. vasárnap, 13:49

Alighanem rajtam kívül sokan vagyunk úgy, hogy a jól megszokott, és a hobbihoz, fejlesztéshez bőven elegendő programozási nyelven kívül nemigen szeretnénk egy másikat is megtanulni. Vagy mert nem akarjuk, vagy mert nincs rá időnk/lehetőségünk.

Én így vagyok a C-vel, ám időnként rákényszerülök, hogy belenézzek egy-egy C-ben megírt programba, hogy ötleteket, megoldásokat keressek, de bizonyos parancsok, vagy a sajátos szintaktika miatt nem egyértelmű, vagy megfejthetetlen egy-egy parancs a C ismeretének hiánya miatt.

Azt hiszem nem tévedek nagyot azzal, hogy az itt fórumozók közül sokan mindkét programozási nyelvben járatosak, és remélem, hogy a segítőszándék is megvan néhányukban!

Segítsünk tehát egymáson, írjuk ide, ami nem világos, és talán akad olyan topiktárs, aki - ha nem is fordítja le Bascom-ra az adott parancsot, programrészletet - elmagyarázza az adott sor/sorok működését, hogy át tudjuk írni Bascom-ra!

Egy "egyszerű" példával kezdem a sort. Egy C-nyelven írt program az AVR egyik lábát vizsgálja. De hogy pontosan mit, ez nem világos.
Így néz ki a két sor:

Kód: Egész kijelölése

while(PINB&(1<<MISO));
   while(!(PINB&(1<<MISO)));


Amennyire sikerült dekódolni ezt az egymást követő két sort, a MISO láb állapotfigyeléséről lehet szó - legalábbis a "while" parancs alapján.
De pontosan mit és meddig csinál az első és a második sor?

A segítséget előre is köszönöm!

Avatar
Higgins
Tranzisztorgyógyász
Hozzászólások: 169
Csatlakozott: 2006. február 23. csütörtök, 7:00
Tartózkodási hely: Győr
Kapcsolat:

HozzászólásSzerző: Higgins » 2009. március 29. vasárnap, 14:41

Homályosak már a C/C++ tanulmányaim az egyetemről, de a

<< ("tedd bele")
>> ("olvasd be") jelenti, gondolom sima C-ben is ezt jelenti.
Ha nem akkor előre is bocsánat. :(

Első ránézésre és hirtelen rávágva az általad beillesztett kódrészlet, a következőt jelenti:



Kód: Egész kijelölése

while(PINB&(1<<MISO));
(addig vár amíg, a MISO logikai "1" állapotú nem lesz)

   while(!(PINB&(1<<MISO))); (ez az előzőnek a negáltja, vagyis a fordítottja, mivel a "!" jel is ott van előtte)
 


Remélem tudtam segíteni.
Akit érdekel a C nyelv és nem akar könyvet venni, vagy csak meg akar lesni valamit, az nézze meg ezt az oldalt:
http://www.cprogramming.com/

ui: ha valami baromságot mondtam volna, akkor javítson ki valaki :)


Üdv: Higgins 8)

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3344
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2009. március 29. vasárnap, 14:50

Megerősítem:
while(feltétel)utasítás
Végrehajtja a ciklusmagot, míg feltétel hamissá nem válik.
& bitset (itt beállítást jelent), << olvasd be , ! logical_not
Vagyis szerintem megvárja MISO + - jelszint váltását.

Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00
Tartózkodási hely: Szolnok

HozzászólásSzerző: dummy » 2009. március 29. vasárnap, 15:31

Köszönöm a gyors segítséget!

Akkor ezek szerint a program nem folytatódik addig, amíg a MISO-n nem történik meg egy 1 -> 0 átmenet?

C-ben hogyan kapcsolják be a belső felhúzóellenállást egy adott portlábon?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9993
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2009. március 29. vasárnap, 16:24

Bascom:

bitwait


C-ben DDRx illetve a másik belső regiszter

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3344
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2009. március 29. vasárnap, 18:36

Valahogy így:
// PORT D initialization
// Bits 0..3 inputs
// Bits 4..7 outputs
DDRD=0xf0;
// Use pull-ups on bits 0..3 inputs
// Output 1 on 4..7 outputs
PORTD=0x07;

Avatar
irak
Biztosítékgyilkos
Hozzászólások: 73
Csatlakozott: 2005. november 2. szerda, 7:00
Tartózkodási hely: Győr
Kapcsolat:

HozzászólásSzerző: irak » 2009. április 1. szerda, 13:02

"ui: ha valami baromságot mondtam volna, akkor javítson ki valaki :)"

Az a << jel, az a biteltolást jelenti.
A MISO makró a bit sorszámával egyezik, a c-nek pedig a bit értéke kell.
Ezért van így megadva.

1<<MISO az takarja: 2^MISO...azaz 2^4
Ergo: PINB&16 -=> a kívánt bit kimaszkolása.
Azért van zárójelbe téve, mert az &-ot az << elött hajtaná végre.

Persze ne vegyétek rossz néven, csak gondoltam legyen teljes a visszafejtés :)

Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00
Kapcsolat:

HozzászólásSzerző: norbi » 2009. április 2. csütörtök, 12:22

"Irak"-nak van igaza, a C-ben a ">>" ; "<<" operátorpár az aktuális változó bitjeinek léptetésére szolgál.

Balrashiftnél az alsó bitek helyére mindig nullák mennek (csak el kel képzelni, logikus), jobbra shiftnél lehetnek gondok, mert akkor a becsúszó bitek felveheteik az MSB értékét, de ez most mellékes.

8)

Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00
Tartózkodási hely: Perbál
Kapcsolat:

HozzászólásSzerző: tetye » 2011. február 28. hétfő, 11:28

Üdv!
Valaki tudna nekem abban segíteni hogy programban a lábkiosztást át írja, majd ismét lefordítja és elküldi a hex-et?
Amit változtatni kellene:
Avr(ATMEGA8) lábai:
Ami most: Amire kéne:

14-26 gondolom nem sértődik meg ha az ADC3 lábra kerül az R1.
5-2 DB7
4-3 DB6
3-4 DB5
2-5 DB4
11-6 E
6-11 RS

Feltöltöttem a file csere-bere tartalmak közé Tranzisztor_teszter_ekezetes.zip néven.
A zipben lévőt kéne átírni, elvileg ez a jó(Magyar).
Köszi!

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3344
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2011. március 1. kedd, 11:08

Ezt telepíted: AVR Studio 4
http://www.atmel.com/dyn/products/tools ... ol_id=2725

Létrehozol 1 új Projectet, Belemásolod a cucost.
Javítod, lefordítod!
Örülsz! Nem vársz Másra!

:wink:

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9993
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2011. március 1. kedd, 12:40

WinAVR felrak, majd az AVRStudio és a 3 servicepack. Közte újraindítod...
Betölt, lefordít, örül...
3/4 óra alatt kész:)

Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00
Tartózkodási hely: Perbál
Kapcsolat:

HozzászólásSzerző: tetye » 2011. március 1. kedd, 20:07

Ez nem a lustaság, fel van telepítve mind fel is volt mert próbálkoztam vele de álltalában ezt:

Kód: Egész kijelölése

> "make.exe" all
make.exe: *** No rule to make target `all'.  Stop.

> Process Exit Code: 2
> Time Taken: 00:00

kapom vissza vagy hasonló üzit.
Addig eljutottam hogy az lcd portokat itt tudom átírni, de nem értem eléggé mert a DB4-7 ig nem találom.
Ez nem tudom mi:

Kód: Egész kijelölése

#define LCD_PORT PORTD
#define LCD_DDR DDRD
Ezt tudom, át is írtam ahogy nekem kell:
#define LCD_RS PD5
#define LCD_EN1 PD4

Bascomban igy néz ki ezt vágom is de c-t nem értem.

Kód: Egész kijelölése

Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.5


Meg azt sem találom hogy a portb0 hol van benne, hogy át tudjam írni azt is a portc3 ra.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9993
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2011. március 1. kedd, 20:55

Te szétszedted több portra az LCD-t...
A programot kell újraírni emiatt, legalábbis az LCD-kezelő részt...

Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00
Tartózkodási hely: Perbál
Kapcsolat:

HozzászólásSzerző: tetye » 2011. március 2. szerda, 8:55

Átírtam így:

Kód: Egész kijelölése


// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
//


//LCD
void lcd_data(unsigned char temp1);
void lcd_command(unsigned char temp1);
void lcd_send(unsigned char data);
void lcd_string(char *data);
void lcd_enable(void);
void lcd_init(void);
void lcd_clear(void);
void lcd_eep_string(const unsigned char *data);

//Software-UART
extern void uart_putc(uint8_t data);
void uart_newline(void);


//LCD-Befehle
#define CMD_SetEntryMode         0x04
#define CMD_SetDisplayAndCursor  0x08
#define CMD_SetIFOptions         0x20
#define CMD_SetCGRAMAddress      0x40    // für Custom-Zeichen
#define CMD_SetDDRAMAddress      0x80    // zum Cursor setzen

//Makros für LCD
#define Line1() SetCursor(1,0)   //An den Anfang der 1. Zeile springen
#define Line2() SetCursor(2,0)   //An den Anfang der 2. Zeile springen

#define SetCursor(y, x) lcd_command((uint8_t)(CMD_SetDDRAMAddress + (0x40*(y-1)) + x)) //An eine bestimmte Position springen

//#define LCDLoadCustomChar() lcd_command(CMD_SetCGRAMAddress)   //Custom-Zeichen laden
#define LCDLoadCustomChar(c) lcd_command((uint8_t)(CMD_SetCGRAMAddress + 8 * c ))   //Custom-Zeichen laden

//Eigene Zeichen
#define LCD_CHAR_OMEGA  244   //Omega-Zeichen
#define LCD_CHAR_U  228      //µ-Zeichen
#define LCD_CHAR_DIODE  0   //Dioden-Icon; wird als Custom-Character erstellt
 
// LCD Befehle
 
#define CLEAR_DISPLAY 0x01
 
// Pinbelegung für das LCD, an verwendete Pins anpassen
 
//#define LCD_PORT      PORTD
//#define LCD_DDR       DDRD
#define LCD_DB4   PD3
#define LCD_DB5   PD2
#define LCD_DB6      PD1
#define LCD_DB7   PD0
#define LCD_RS        PD5
#define LCD_EN1       PD4


De ez nem jó neki, ezt írja:

Kód: Egész kijelölése

Build started 2.3.2011 at 08:52:16
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
In file included from ../main.c:4:
c:/winavr-20090313/lib/gcc/../../avr/include/util/delay.h:85:3: warning: #warning "F_CPU not defined for <util/delay.h>"
../main.c: In function 'main':
../main.c:476: warning: implicit declaration of function 'lcd_eep_definition'
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT lcd-routines.o -MF dep/lcd-routines.o.d  -c  ../lcd-routines.c
In file included from ../lcd-routines.c:8:
c:/winavr-20090313/lib/gcc/../../avr/include/util/delay.h:85:3: warning: #warning "F_CPU not defined for <util/delay.h>"
../lcd-routines.c: In function 'lcd_data':
../lcd-routines.c:16: error: 'LCD_PORT' undeclared (first use in this function)
../lcd-routines.c:16: error: (Each undeclared identifier is reported only once
../lcd-routines.c:16: error: for each function it appears in.)
../lcd-routines.c: In function 'lcd_command':
../lcd-routines.c:39: error: 'LCD_PORT' undeclared (first use in this function)
../lcd-routines.c: In function 'lcd_send':
../lcd-routines.c:49: error: 'LCD_PORT' undeclared (first use in this function)
../lcd-routines.c: In function 'lcd_enable':
../lcd-routines.c:63: error: 'LCD_PORT' undeclared (first use in this function)
../lcd-routines.c: In function 'lcd_init':
../lcd-routines.c:75: error: 'LCD_DDR' undeclared (first use in this function)
../lcd-routines.c:78: error: 'LCD_PORT' undeclared (first use in this function)
make: *** [lcd-routines.o] Error 1
Build failed with 8 errors and 3 warnings...

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9993
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2011. március 2. szerda, 12:56

Make fileban nem definiáltad az órajelet.

Az eredti prg 1 portra megírt LCDvezérést tartalmaz. És itt az egyes lábal az egyes bitek és ezen át vezérled.

Teneked:
-NINCS megadva az órajel (f_CPU)
- az LCDlábadat szétszórod több portra, így az LCDrutint összevissza át kell írni. Ez nem bascom, ahol szabadon rakosgatható:)))

Az LCD vezérlő rutint kell átírni, NEM a definíciókat! A több port miatt!


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég