Fórum témák
- • Villanyszerelés
- • Videomagnó problémák
- • Mosogatógép hiba
- • ARM CPU assembler programozás
- • Felajánlás, azaz ingyen elvihető
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Porszívó javítás
- • Kazettás magnó (deck) javítása
- • Klíma beszerelése, fűtés-hűtés házilag
- • Számítógép tápegység
- • Autórádió (fejegység) problémák, kérdések, válaszok
- • Számítógép hiba, de mi a probléma?
- • Fejhallgató erősítő
- • Erősítő mindig és mindig
- • FET vezérlése
- • 433 MHz adóvevő modul tapasztalatok
- • Eredményjelző
- • Villanymotor mi a hiba?
- • Li-Po - Li-ion akkumulátor és töltője
- • Labortápegység készítése
- • Zajos transzformátor
- • Klíma szervizelés, javítás
- • Kombikazán működési hiba
- • LED-es világítás
- • Arduino
- • Elektromos távirányítós kapunyitó
- • Audiofil, High End Audio
- • Opto kapu és triak
- • Villanymotor bekötése
- • Mosógép vezérlők és általános problémáik
- • Boombox javítás
- • Oszcillátor építése rajzok
- • PLC kérdések
- • Kutya macska (vad) riasztó
- • PC táp átalakítás
- • Kapcsolási rajzot keresek
- • Opel Astra elektromos hibák
- • Rádió adó építése
- • Áramváltó trafóval áram mérés, hogy?
- • Elektromágnes
- • Rossz HDD javítás, mentés
- • Rádió áthangolása, OIRT - CCIR konverter
- • Ultrahangos párásító
- • EAGLE NYÁK tervező
- • ESR mérő
- • Analóg voltmérő (multiméter)
- • WLAN router
- • Tápegységgel kapcsolatos kérdések
- • Kapcsolóüzemű táp 230V-ról
- • Rádióamatőrök topikja
- • Retro számítógépek
- • Marantz erősítő hiba
- • Videoton EA-7386-s erösítő
- • Villanypásztor
- • Hegesztő inverter javítás
» Több friss téma
|
Fórum » AVR - Miértek hogyanok
WinAVR / GCC alapszabályok:
1. Ha ISR-ben használsz globális változót, az legyen "volatile"
2. Soha ne érjen véget a main() függvény
3. UART/USART hibák 99,9% a rossz órajel miatt van
4. Kerüld el a -O0 optimalizációs beállítást minden áron
5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás
6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et
Bővebben: AVR-libc FAQ
Sziasztok.
Egyszerűen nem jutok dűlőre. I2C-t élesztek egy atmega168-on 3,3v-os üzemfeszen. a célpont egy 24aa32a Bővebben: Link
EEPROM. De más I2C eszköz se megy.
Az itteni TWI cikkből indultam ki, az általa ajánlott drivert használom. Az alábbi linken eléritek a projekt fájlt: Kód
A helyzet a következő: a startjel + a cím kimegy, analóg szkópon szépen látom. Viszont nem jön ACK. Sehogy se jön.
A driver megakad az ACK várásba és folyamatosan küldi ki a címet(így látom az egész frame-et az analóg szkópon.).
Se MPU 6050, se ez a pofon egyszerű EEPROM. kizárt h hibás legyen, ma vettem.
A felhúzó ellenállás 2,2K, üzemfesz 3,3V stabilan.
3 napja ezzel szenvedek. MIÉRT? 
Mit tudnék még megnézi?
Köszönöm!
Ha latod szkopon, hogy kimegy a START es a SLAVE address, es megsem jon ACK, akkor lehet, hogy egyszeruen rossz a slave address. Az A0..A2 labak hol vannak? Mit latni a szkopon, mi a kikuldott cim? Ja, es mennyi az orajel sebesseg?
Sziasztok,
Egy kis segítségre lenne szükségem, nemrég kezdtem el Arduino-val foglakozni és már az első komolyabb feladatnál elakadtam. Készítettem egy egyszerű kis áramkört 4db bemenet 4db kimenet, soros port. A program lényege, hogy soros port-ról tudjam kapcsolni a reléket ill. lekérdezni a bemeneteket. A fejlesztéshez Arduino Uno-t használtam, a program működött rajta. Szerettem volna ezt a progit feltölteni a "valós" környezetébe, ugyanis készült hozzá egy nyák amin minden rajta van, többek között egy Attiny2313 vezérlő. Ekkor jött a feketeleves, a fordító szerint a 24. sorban van egy hiba "class Hardwareserial has no nember named readStringUntil" Több megoldást is próbáltam, de sajnos nemtudok rájönni a hiba okára. A másik gondd, hogy szerintem a program nemfog beleférni a prociba, amit nemigazán értek miért....
Üdv.: Imi
Akkor ha atmega16-ot használok aakkor kevesebb tábfesz kell neki csak anyi a különbség?
Arduino minimum memóriaigény: 1k. ATTiny: 128 byte
Flash igény: 2...5k. Tinyben van 2k.
Arduino _NEM_ támogat más chipet: M8,168,328,32u4,1280,2560.
Azaz a Tinyre a fejlesztési irányod rossz.
Az Arduino nem támogatja az Attiny2313-ast!
A leg kisseb lehetőség ATMega8-as. Használd azt.
Vagy írd meg a programod Asemblerben.
Tisztelt fórumtársak!
Nem fejlesztek AVR-re, és egyelőre más mikrokontrollerre sem, a problémámra úgy érzem, mégis itt kaphatok segítséget:
Rendelkezésre áll egy lefordított hex-fájl, ami egy ATMEGA8-ra írt programot, és a hozzá tartozó eeprom-tartalmat "rejti". Ezt kellene felírnom egy ATMEGA8-ra, de nem a fejlesztőkörnyezetből, hanem egy XELTEK SUPERPRO programozóval, mely egy univerzális eszköz, azaz gyakorlatilag több, mint 30000-féle IC-t támogat, köztük természetesen az ATMEGA8-at is.
A problémát az okozza, hogy az említett .hex-fájl egyben tartalmazza magát a flash-részbe kerülő programot, és az eep-tartalmat is, nekem viszont a XELTEK kezelőprogramjába két külön bufferbe kell betöltenem a két memória tartalmát, majd felprogramozni azt.
Az tehát a kérdés, hogy lehetőség van-e valamilyen módon különválasztani a fájlból a két részt. Próbálok keresgélni, de persze ez időbe telik, így minden lehetséges segítséget szívesen fogadok.
Köszi!
A standard HEX az a szabvány szerint nem tartalmazza az EPP-t. 2 külön állomány adott ilyenkor:
HEX - programkód
EPP - EEprom file
A lefordítást mivel csinálták? Hátha az a program saját formátumát kaptad meg...
Köszi, így lehet, hogy tisztább a kép, ugyanis én csak egy fájlt kaptam, de annak ".eep" a kiterjesztése nem ".epp". Nem lehet, hogy te is azt akartad írni?
Az EEPROM-ba kerülő tartalom milyen formátumban kerül ki a fordítóból? Mert a mellékelt állomány szerint ez is HEX.
Szia Sucuka!
Igen, minden bizonnyal TavIR is .EEP kiterjesztést szeretett volna írni.
A programkód (*.hex) és az EEPROM tartalom is (*.eep) jobbára Intel hexa formátumú fájlok.
Szövegszerkesztővel kimásolhatóak belőle egyes sorok, amelyeket lehet, hogy valami offset értékkel kell betölteni a külső programozód memóriájába. Ezeket a memória címeket a programozókból meg lehet tudni amikor kiválsztjuk a programozandó eszközt. Az én WELLON programozómnál is így van.
Nem hiszem, hogy igy barki valaszolni fog...
Mindkét AVR működik alacsonyabb tápfeszültségről is, viszont kisebb órajellel. Minden AVR adatlapján rajta van, hogy mekkora feszültség esetén mekkora a maximális órajel.
Sziasztok!
Van egy apró problémám. Van egy órám, egy rtc-ből olvasom az időt és vfd-n jeleníti meg. Ezzel nincs is gond. Viszont automatikus nyári-téli átállást csináltam bele, de nem működik. Minden érték jó, de nem hajtódik végre. Itt a kódrészlet, hátha valaki megtalálja a gondot.
void atallit(){
datum();
if((idoszamitas==1) && (honap==3) && (nap>=25) && (hetnap==7) && (hour==2)){
I2C_write(0x02, 0x03);
idoszamitas = 2;
EEPROM_write(0x01, 2);
}
if((idoszamitas==2) && (honap==10) && (nap>=25) && (hetnap==7) && (hour==3)){
I2C_write(0x02, 0x02);
idoszamitas = 1;
EEPROM_write(0x01, 1);
}
}
A hozzászólás módosítva: Okt 31, 2014
Ennyi kodbol nehez megmondani. A honap, nap, ora, stb. nem BCD veletlenul? Mert akkor honap == 0x10 kellene. Meg nap >= 0x25. Az idoszamitas-t felolvassa EEPROM-bol? Jo az erteke?
Ebben lehet igazad van, hiszen bcd átalakító van hajtva az avr-ről plusz hexában van kiolvasva az érték is. Tudtam én, hogy valami apróságot nem veszek észre.
Sziasztok, atmega8 uC-el szeretnék egy pwm-es áram generátort építeni amivel tudom szabályozni egy DC motor áramát (kb 800mA) amit akkumulátorról (20V 1,5 Ah) szeretnék hajtani.Tudnátok kapcsolási rajzot mutatni/linkelni? Köszönöm előre is!
Szia! L293D még elbírja, L298 biztosan (ST gyárt 1 hidat is 6318 vagy mi, de azok drágábbak), L293E-nél ki van vezetve árammérő ellenállásnak a híd alsó fele, de irreálisan drága.
Ha nem kell forgásirány váltás, akkor egy IRFZxxx NFET, GND felé egy árammérő 0.3-0.6ohm.
Sziasztok!
KS0108 grafikus LCD-t szeretnék vezérelni. A jól bevált library-m most sajnos nem jó:
lcd.c
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "ks0108.h"
lcdCoord ks0108Coord;
uint8_t ks0108Inverted=0;
ks0108FontCallback ks0108FontRead;
uint8_t ks0108FontColor;
const uint8_t* ks0108Font;
uint8_t Reverse( uint8_t x )
{
x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa);
x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc);
x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);
return x;
}
uint8_t ks0108ReadFontData(const uint8_t* ptr) {
return pgm_read_byte(ptr);
}
void ks0108SelectFont(const char* font, ks0108FontCallback callback, uint8_t color) {
ks0108Font = font;
ks0108FontRead = callback;
ks0108FontColor = color;
}
int ks0108PutChar(char c) {
uint8_t width = 0;
uint8_t height = ks0108FontRead(ks0108Font+FONT_HEIGHT);
uint8_t bytes = (height+7)/8;
uint8_t firstChar = ks0108FontRead(ks0108Font+FONT_FIRST_CHAR);
uint8_t charCount = ks0108FontRead(ks0108Font+FONT_CHAR_COUNT);
uint16_t index = 0;
uint8_t x = ks0108Coord.x, y = ks0108Coord.y;
if(c < firstChar || c >= (firstChar+charCount)) {
return 1;
}
c-= firstChar;
// read width data, to get the index
for(uint8_t i=0; i<c; i++) {
index += ks0108FontRead(ks0108Font+FONT_WIDTH_TABLE+i);
}
index = index*bytes+charCount+FONT_WIDTH_TABLE;
width = ks0108FontRead(ks0108Font+FONT_WIDTH_TABLE+c);
// last but not least, draw the character
for(uint8_t i=0; i<bytes; i++) {
uint8_t page = i*width;
for(uint8_t j=0; j<width; j++) {
uint8_t data = ks0108FontRead(ks0108Font+index+page+j);
if(height < (i+1)*8) {
data >>= (i+1)*8-height;
}
if(ks0108FontColor == BLACK) {
ks0108WriteData(data);
} else {
ks0108WriteData(~data);
}
}
// 1px gap between chars
if(ks0108FontColor == BLACK) {
ks0108WriteData(0x00);
} else {
ks0108WriteData(0xFF);
}
ks0108GotoXY(x, ks0108Coord.y+8);
}
ks0108GotoXY(x+width+1, y);
return 0;
}
void ks0108Puts(char* str) {
int x = ks0108Coord.x;
while(*str != 0) {
if(*str == '\n') {
ks0108GotoXY(x, ks0108Coord.y+ks0108FontRead(ks0108Font+FONT_HEIGHT));
} else {
ks0108PutChar(*str);
}
str++;
}
}
uint8_t ks0108CharWidth(char c) {
uint8_t width = 0;
uint8_t firstChar = ks0108FontRead(ks0108Font+FONT_FIRST_CHAR);
uint8_t charCount = ks0108FontRead(ks0108Font+FONT_CHAR_COUNT);
// read width data
if(c >= firstChar && c < (firstChar+charCount)) {
c -= firstChar;
width = ks0108FontRead(ks0108Font+FONT_WIDTH_TABLE+c)+1;
}
return width;
}
uint16_t ks0108StringWidth(char* str) {
uint16_t width = 0;
while(*str != 0) {
width += ks0108CharWidth(*str++);
}
return width;
}
void ks0108GotoXY(uint8_t x, uint8_t y) {
uint8_t chip = CHIP1, cmd;
if(x > 127) x = 0; // ensure that coordinates are legal
if(y > 63) y = 0;
ks0108Coord.x = x; // save new coordinates
ks0108Coord.y = y;
ks0108Coord.page = y/8;
if(x >= 64) { // select the right chip
x -= 64;
chip = CHIP2;
}
cmd = LCD_SET_ADD | x;
ks0108WriteCommand(cmd, chip); // set x address on active chip
cmd = LCD_SET_PAGE | ks0108Coord.page; // set y address on both chips
ks0108WriteCommand(cmd, CHIP1);
ks0108WriteCommand(cmd, CHIP2);
}
void ks0108Init(uint8_t invert) {
ks0108Coord.x = 0;
ks0108Coord.y = 0;
ks0108Coord.page = 0;
ks0108Inverted = invert;
LCD_CMD_DIR = 0xFF; // command port is output
LCD_CS_DIR = (1<<CSEL1) | (1<<CSEL2);
ks0108WriteCommand(LCD_ON, CHIP1); // power on
ks0108WriteCommand(LCD_ON, CHIP2);
ks0108WriteCommand(LCD_DISP_START, CHIP1); // display start line = 0
ks0108WriteCommand(LCD_DISP_START, CHIP2);
ks0108ClearScreen(); // display clear
ks0108GotoXY(0,0);
}
inline void ks0108Enable(void) {
LCD_CMD_PORT |= 0x01 << EN; // EN high level width: min. 450ns
asm volatile("nop\n\t"
"nop\n\t"
"nop\n\t"
::);
LCD_CMD_PORT &= ~(0x01 << EN);
for(volatile uint8_t i=0; i<8; i++); // a little delay loop (faster than reading the busy flag)
}
void ks0108FillRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color) {
uint8_t mask, pageOffset, h, i, data;
height++;
pageOffset = y%8;
y -= pageOffset;
mask = 0xFF;
if(height < 8-pageOffset) {
mask >>= (8-height);
h = height;
} else {
h = 8-pageOffset;
}
mask <<= pageOffset;
ks0108GotoXY(x, y);
for(i=0; i<=width; i++) {
data = ks0108ReadData();
if(color == BLACK) {
data |= mask;
} else {
data &= ~mask;
}
ks0108WriteData(data);
}
while(h+8 <= height) {
h += 8;
y += 8;
ks0108GotoXY(x, y);
for(i=0; i<=width; i++) {
ks0108WriteData(color);
}
}
if(h < height) {
mask = ~(0xFF << (height-h));
ks0108GotoXY(x, y+8);
for(i=0; i<=width; i++) {
data = ks0108ReadData();
if(color == BLACK) {
data |= mask;
} else {
data &= ~mask;
}
ks0108WriteData(data);
}
}
}
uint8_t ks0108DoReadData(uint8_t first) {
uint8_t data;
volatile uint8_t i;
LCD_DATA_OUT = 0x00;
LCD_DATA_DIR = 0x00; // data port is input
if(ks0108Coord.x < 64) {
LCD_CS_PORT &= ~(0x01 << CSEL2); // deselect chip 2
LCD_CS_PORT |= 0x01 << CSEL1; // select chip 1
} else if(ks0108Coord.x >= 64) {
LCD_CS_PORT &= ~(0x01 << CSEL1); // deselect chip 1
LCD_CS_PORT |= 0x01 << CSEL2; // select chip 2
}
if(ks0108Coord.x == 64 && first) { // chip2 X-address = 0
ks0108WriteCommand(LCD_SET_ADD, CHIP2); // wuff wuff
}
LCD_CMD_PORT |= 0x01 << D_I; // D/I = 1
LCD_CMD_PORT |= 0x01 << R_W; // R/W = 1
LCD_CMD_PORT |= 0x01 << EN; // EN high level width: min. 450ns
asm volatile("nop\n\t"
"nop\n\t"
"nop\n\t"
::);
data = Reverse(LCD_DATA_IN); // read Data
LCD_CMD_PORT &= ~(0x01 << EN);
for(i=0; i<8; i++); // a little delay loop (faster than reading the busy flag)
LCD_DATA_DIR = 0xFF;
ks0108GotoXY(ks0108Coord.x, ks0108Coord.y);
if(ks0108Inverted)
data = ~data;
return data;
}
inline uint8_t ks0108ReadData(void) {
ks0108DoReadData(1); // dummy read
return ks0108DoReadData(0); // "real" read
}
void ks0108WriteCommand(uint8_t cmd, uint8_t chip) {
if(chip == CHIP1) {
LCD_CS_PORT &= ~(0x01 << CSEL2); // deselect chip 2
LCD_CS_PORT |= 0x01 << CSEL1; // select chip 1
} else if(chip == CHIP2) {
LCD_CS_PORT &= ~(0x01 << CSEL1); // deselect chip 1
LCD_CS_PORT |= 0x01 << CSEL2; // select chip 2
}
LCD_CMD_PORT &= ~(0x01 << D_I); // D/I = 0
LCD_CMD_PORT &= ~(0x01 << R_W); // R/W = 0
LCD_DATA_DIR = 0xFF; // data port is output
LCD_DATA_OUT = Reverse(cmd); // write command
ks0108Enable(); // enable
LCD_DATA_OUT = 0x00;
}
void ks0108WriteData(uint8_t data) {
uint8_t displayData, yOffset, cmdPort;
if(ks0108Coord.x >= 128)
return;
if(ks0108Coord.x < 64) {
LCD_CS_PORT &= ~(0x01 << CSEL2); // deselect chip 2
LCD_CS_PORT |= 0x01 << CSEL1; // select chip 1
} else if(ks0108Coord.x >= 64) {
LCD_CS_PORT &= ~(0x01 << CSEL1); // deselect chip 1
LCD_CS_PORT |= 0x01 << CSEL2; // select chip 2
}
if(ks0108Coord.x == 64) // chip2 X-address = 0
ks0108WriteCommand(LCD_SET_ADD, CHIP2);
LCD_CMD_PORT |= 0x01 << D_I; // D/I = 1
LCD_CMD_PORT &= ~(0x01 << R_W); // R/W = 0
LCD_DATA_DIR = 0xFF; // data port is output
yOffset = ks0108Coord.y%8;
if(yOffset != 0) {
// first page
cmdPort = LCD_CMD_PORT; // save command port
displayData = ks0108ReadData();
LCD_CMD_PORT = cmdPort; // restore command port
LCD_DATA_DIR = 0xFF; // data port is output
displayData |= data << yOffset;
if(ks0108Inverted)
displayData = ~displayData;
LCD_DATA_OUT = Reverse(displayData); // write data
ks0108Enable(); // enable
// second page
ks0108GotoXY(ks0108Coord.x, ks0108Coord.y+8);
displayData = ks0108ReadData();
LCD_CMD_PORT = cmdPort; // restore command port
LCD_DATA_DIR = 0xFF; // data port is output
displayData |= data >> (8-yOffset);
if(ks0108Inverted)
displayData = ~displayData;
LCD_DATA_OUT = Reverse(displayData); // write data
ks0108Enable(); // enable
ks0108GotoXY(ks0108Coord.x+1, ks0108Coord.y-8);
} else {
if(ks0108Inverted)
data = ~data;
LCD_DATA_OUT = data; // write data
ks0108Enable(); // enable
ks0108Coord.x++;
}
LCD_DATA_OUT = 0x00;
}
A bekötés annyiban különbözik hogy az adat lábak fordítva vannak:
AVR LCD
PA0 D7
PA1 D6
.
.
.
PA6 D1
PA7 D0
A Reverse függvény megváltoztatja a bitek sorrendjét. Valamiért krikszkrakszok jelennek meg a kijelzőn.
Mi lehet a gond? A hozzászólás módosítva: Nov 2, 2014
Üdv!
Egy AVR és ENC28J60-assal bíbelődöm. Jelenleg két komoly gondom van, de most csak az egyiket írom le.
Az IP és a TCP-hez írtam checksum for() ciklust, ami eddig jól ment.
i = 34; // TCP starts at array[i]
y = i+TCP_Total_Length; // array[IP_Total_Length]-20;
for(i=i;i<y;i+=2) // sum all data in selected array
{checksum += ((unsigned int)(array[i]<<8) + (unsigned int)array[i+1]);}
checksum = ((checksum & 0x0000FFFF) + ((checksum>>16) & 0x0000FFFF));
checksum = ~checksum;
A problémám, hogy ha páratlan számú byte-okkal kell számolni, akkor az utolsót megduplázza, így rossz eredményt kapok.
Javaslata valakinek, hogyan lehet?
(Próbáltam ilyen-olyan megoldást a netről, de akkor mindegyik csomagot elrontja. Lehet már túl fáradt vagyok, vagy a fától nem látom az erdőt...)
Egy picit más lesz itt a probléma...
Az oldal nagyon egyszerű, csak egy gomb(ON/OFF) van rajta egy formban:
package_length = String_To_Array(array,package_length,"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache");
package_length = String_To_Array(array,package_length,"<html><body><form action=\"avr.php\" method=\"POST\">");
if(relay[0] == 1)
{package_length = String_To_Array(array,package_length,"<button type='Submit' name='r0' value=0>ON</button><br>");}
else if(relay[0] == 0)
{package_length = String_To_Array(array,package_length,"<button type='Submit' name='r0' value=1>OFF</button><br>");}
package_length = String_To_Array(array,package_length,"</form></body></html>");
Röviden, ha relay[0] == 1 akkor ON gombot küld,
ha relay[0] == 0 akkor OFF gombot.
Amikor először betöltöm az oldalt, akkor alap állapotában páratlan a TCP byteok száma(241byte)(gomb ON állapotban).
Amikor megnyomom a gombot(ON), a TCP byte-ok száma páros lesz. Itt sincs gond. Szépen betölti az új oldalt az OFF gombbal(242byte).
Viszont, amikor megnyomom az OFF gombot, és be kéne töltenie az ON gombos oldalt, ott vérzik el.
A WireShark szerint elküldi az ON oldal csomagját,(241byte),az OFF gomb megnyomása után, de checksum error-t ír ki.
Hogy lehet, az hogy az első oldalnál jól számol, másodszor viszont nem?
Hogy egyáltalán értelmezni tudjuk a problémádat, ismerni kellene a részleteket!
Például ennek a függvénynek a kidolgozását?:
package_length = String_To_Array(array,package_length,”…”)
???
unsigned int String_To_Array(unsigned char array[],unsigned int startat, char *string)
{
unsigned int i = startat;
while(*string>0)
{
array[i] = *string++;
i++;
}
return(i);
}
Közben megtaláltam a lehetséges hibát.
Mivel sok a RAM az AVRben (16KB), így lefoglaltam az elején 2x 1538byte helyet, mint RX ill TX Buffer.
unsigned char RX_BUF[1538]={},TX_BUF[1538]={};
Nem biztos, hogy a legjobb megoldás, de nekem így volt átláthatóbb.
Szóval, az történik, hogy:
Amikor meghívom az első oldalt, azt szépen betölti a TX_BUF helyre, majd elküldi az ENC28J60-nak.
Amikor megnyomom a gombot, akkor ismét beleír a TX_BUF helyre, így felülírja az előző adatokat.
A gond ott keletkezik, amikor másodszor nyomom meg a gombot, ekkor ugyan beleír a TX_BUF-erbe, de ekkor az byte-ok száma 1-el kisebb lesz(mivel az ON gombos oldal csak 241byte, az OFF meg 242), mint előtte. Így a 242.-dik byte már nem íródik felül és megmarad az előző értéke, ami valószínűleg nem 0 volt.
for(i=i;i<y;i+=2) // sum all data in selected array
{checksum +=((unsigned int)(array[i]<<8) + (unsigned int)array[i+1]);}
A checksum() for() ciklusa 2 byteból csinál egy integert amit hozzáad a checksum nevű temp változóhoz. Ha az integert alkotó alsó byte nem kell (páratlan számú TCP csomag esetében), akkor annak 0nak kell lennie.
Mivel a TX_BUF 242-byteja nem íródott felül, így az nem 0 volt, hanem 0x3e és így már borult is a checksum eredménye.
Miért fut le első indításra?
Mert a TX_BUF először üres, minden byte benne 0.
Szóval az átmeneti megoldásom az lett, hogy minden befejezett küldés után resetelem a TX_BUF-ert.
Így már működik is!
Köszönöm a segítséget! Akkor eszerint a csatolt állomány csak az EEPROM-ba kerülő tartalom, és kéne mellé még a programkód HEX-állománya is. A címeknek majd utánajárok, remélem sikerül. És a feltöltendő programkódot is el kell kérnem a megrendelőmtől.
Valaki rápillantana erre?
Nem néztem végig az egészet, de biztos valahol nem hívod meg Reverse függvényt.
A végén Pl.:
} else {
if(ks0108Inverted)
data = ~data;
LCD_DATA_OUT = data; ??? // write data
ks0108Enable(); // enable
Ez a legutolsó sorban volt és valóban nem. Viszont így sem jó. Beraktam oda is, azelőtt krikszkrakszok jelentek meg, most pedig egy pixel sincs bekapcsolva.
A kijelzonek szolo parancsoknal is meg vannak forgatva a bitek?
Idézet: „A bekötés annyiban különbözik, hogy az adat lábak fordítva vannak:
AVR LCD
PA0 D7
PA1 D6
.
.
.
PA6 D1
PA7 D0
A Reverse függvény megváltoztatja a bitek sorrendjét. Valamiért krikszkrakszok jelennek meg a kijelzőn.
Mi lehet a gond?
1. uint8_t Reverse( uint8_t x )
2. {
3. x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa);
4. x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc);
5. x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);
6. return x;
7. } ”
Szerintem ez a függvény a gond!
Ezzel a fuggvennyel semmi gond nincs. Teljesen jol mukodik.
|
|