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

C-ből Bascomba!

Hozzászólás Szerző: dummy »

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

Hozzászólás Szerző: Higgins »

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: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

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

Hozzászólás Szerző: dummy »

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: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Bascom:

bitwait


C-ben DDRx illetve a másik belső regiszter
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

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

Hozzászólás Szerző: irak »

"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

Hozzászólás Szerző: norbi »

"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

Hozzászólás Szerző: tetye »

Ü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: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

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: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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

Hozzászólás Szerző: tetye »

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: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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

Hozzászólás Szerző: tetye »

Á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: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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!
Válasz küldése