Fórum témák
- • PROM (TBP18S030N)
- • Indukciós főzőlap, sütő bekötése, kábelek kiépítése
- • Kazettás magnó (deck) javítása
- • Hűtőgép probléma
- • Szárítógép problémák
- • Számítógép hiba, de mi a probléma?
- • VF2 végerősítő
- • Mikrovezérlős cambus-os izzító relé
- • Arduino
- • Klíma beszerelése, fűtés-hűtés házilag
- • Általános antennás kérdések, válaszok
- • Fejhallgató erősítő
- • Klíma szervizelés, javítás
- • Napelem kivitelező keresése / kiválasztása
- • Lézer érzékelő
- • Kapcsolási rajzot keresek
- • MyElecParts alkatrész kereső és készlet nyilvántartó
- • Sprint-Layout NYÁK-tervező
- • Mosogatógép hiba
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • NYÁK-tervező programok
- • Napelem alkalmazása a lakás energia ellátásában
- • Hörmann kapuk
- • Videomagnó problémák
- • PIC programozás assemblyben
- • Vásárlás, hol kapható?
- • Oszcilloszkóp vétel, mit gondoltok?
- • Vicces - mókás történetek
- • Kapcsolóüzemű táp 230V-ról
- • Oszcilloszkóp, avagy hogyan kell használni?
- • Kutya macska (vad) riasztó
- • Hangsugárzó építés, javítás - miértek, hogyanok
- • Hegesztő inverter javítás
- • FET vezérlése
- • Érdekességek
- • Erősítő mindig és mindig
- • Áramlökés határoló lágyindító
- • Hibrid erősítő
- • Egyfázisú villanymotor fordulatszám szabályozása
- • Transzformátor készítés, méretezés
- • IMI villanymotor
- • Műhelyünk felszerelése, szerszámai
- • Robotfűnyíró vagy fűnyíró robot
- • Kombikazán működési hiba
- • Villanyszerelés
- • Rádiótechnika számok keresése
- • Porszívó javítás
- • Rendelés külföldről (eBay - Paypal)
- • Szobatermosztát bekötése
- • Sárga Kazettás Piaci Nintendo (8bit)
- • Muzeális készülékek-alkatrészek restaurálása
- • Toroid transzformátor
- • LCD TV probléma
- • Elektromos távirányítós kapunyitó
- • SMD forrasztás profin
» 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, nincs valakinek véletlenül watchdog példaprogramja, amiben szimplán interrup-ként van használva és nem indítja újra az MCU-t? Az igaz, hogy a watchdog a hozzá tartozó fuse bit nélkül is használható? Azt olvastam, hogy ha csak simán interrupt-ként akarom használni nem kell beállítani a fuse bitjét. Egyszerűen csak szeretnék egy interruptot csinálni 1sec tétlenség után timer elpazarlása nélkül
Mindenki a WinAVR-t szapulja, pedig (szerintem) már mindenki az utódját(AVR Toolchain) használja,
még a megrögzött fanatikus Studio4-et használók is (mint pl. én). A Toolchain-ról mi a véleményetek? A hozzászólás módosítva: Márc 6, 2015
Szia!
Kiollózva egy régi programomból (Basic):
Config Watchdog = 2048
On Watchdog Wd_int ISR helye
Wdtcr = &B01001000 Ez a lényeg!
Aztán START WD.
Wd_int: WD ISR eleje
Set Wdtcr.6 'WDIE=ENABLE
..........................
Remélem beválik.
JAni
(#) |
wbt hozzászólása |
Márc 6, 2015 |
 |
/ |
 |
|
Programból lehet bizergálni az AVR FUSE-biteket?
Most bootloader-el megy a frissítés, de van ISP is rajta, amin keresztül bárki
kiolvashatja a teljes programot. No, most letilthatom az ISP-t, de akkor
egy rossz húzással (tipikusan bootloader vacakol) kizárhatom magam.
Arra gondoltam, hogy soroson beküldött azonosítóval ki tudnám-e nyitni újra
az ISP-t, hogy a sok kísérletezgetés közben ne gyártsak téglákat vagy csúzli lövedék alapanyagot.
Ja, a bootloader csak feltölteni tud, semmi mást. ATmega328P az áldozat.
JAni
Ne az ISP-t tiltsd le. A locknál a read/verify programot.
Így ChipeErase-vel ISP-vel még tudod programozni. Ja a LPM/SPM Boot disable-t állítsd be, hogy a bootloadert nehogy felülírd bootloaderes programozáskor
Köszi, de nekem C mintakód kéne
1db barom vagyok...
Hát ja, akkor ISP-n az Erase működik, csak kiolvasni nem tudja. Szóval,ha jól értem,
bármilyen gond esetén nem lesz tégla a cucc (max visszahozzák élesztésre).
Köszönöm! Azonnal ki is próbálom!
Amilyen aljas vagyok, még arra gondoltam,hogy mondjuk az ISP valamelyik lábát összekötöm/lekötöm GND-re stb. Bekapcsolás után megnézem az állapotát, ha
nincs rendben (mert rádugta az a saját ISP-jét és rájött, hogy el kell távolítani egy ellenállást pl.) akkor bevések gyorsan az eepromba valamit, amitől borul a működés (majd valamikor).
Tehát az EEPROM-ot is analizálnia kell, hogy melyik adat küldi el az erdőbe a cuccot néha.
Vagy valami ilyesmi...
JAni
Szerintem a WDTCSR regiszter WDIE bitje kell neked (a WDP2 és WDP1 adja a 1sec-et):
int main(void)
{
...
cli();
WDTCSR = (1<<WDCE) | (1<<WDE);
WDTCSR = (1<<WDIE) | (1<<WDP2) | (1<<WDP1);
sei();
...
}
ISR (WDT_vect)
{
...
}
+ ha jól tudom, a WTDON fuse bit-et nem szabad beállítani, mert akkor a WDTCSR-től függetlenül mindig reset lesz. A fenti részlet atmega168-ra van.
Köszi a segítséget! Elkészült a program, annyit csinál, hogy 4sec (kicsit több) tétlenség után ellövi a watchdogot és lefut a kód az ISR() függvényben,viszont nem reseteli a kontrollert, megmaradnak a változók aktuális értékei. A WDTON fuse bitet nem kell beállítani hogy működjön. Gyakorlatilag timer overflow interrupt csak timer elpazarlása nélkül, az kell a PWM-hez  A kód mega48-on fut szépen.
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/wdt.h> // Supplied Watch Dog Timer Macros
#include <avr/sleep.h> // Supplied AVR Sleep Macros
#define LED 0
#define LED_OFF() PORTB &= ~(1<<LED)
#define LED_ON() PORTB |= (1<<LED)
void PORT_INIT(void){
DDRB |= (1<<LED);
}
void main(void)
{
PORT_INIT();
if(MCUSR & _BV(WDRF)){ // If a reset was caused by the Watchdog Timer...
MCUSR &= ~_BV(WDRF); // Clear the WDT reset flag
WDTCSR |= (_BV(WDCE) | _BV(WDE)); // Enable the WD Change Bit
WDTCSR = 0x00; // Disable the WDT
}
int count = 100;
while(1){
/*----------- Set up Watch Dog Timer for Inactivity -----------*/
cli();
WDTCSR |= (_BV(WDCE) | _BV(WDE)); // Enable the WD Change Bit
WDTCSR = _BV(WDIE) | // Enable WDT Interrupt
_BV(WDP3); // Set Timeout to ~4 seconds -y ezt 16ms-től 8s-ig állíthatjuk, uC adatlapjáról kinézhető
sei();
//Jöhet a kód, ami megakaszthatja a program futását. Ha ez több mint 4s beavatkozunk az ISR(WDT_vect) függvényben
for(int i=0;i<count;i++){_delay_ms(40);} //count értéke egyre nő, így egyre többet várunk míg el nem robban a watchdog
count++;
WDTCSR =0x00; //ha elértünk idáig kireseteljük a watchdogot, minden ok, számolhat előről
/*-------------------------------------------------------------*/
}
}
ISR(WDT_vect) //ez fut le ha ellőttük a watchdog-ot (5x felvillan a led)
{
sleep_disable();
uint8_t i,j;
for(i=0;i<5;i++){
for(j=0;j<4;j++){_delay_ms(30);}
LED_ON();
for(j=0;j<4;j++){_delay_ms(30);}
LED_OFF();
}
sleep_enable();
}
A hozzászólás módosítva: Márc 6, 2015
A MAX31855-nél meg van szabva, hogy mennyi időd kell várni két kiolvasás között, vagy folyamatosan is történhet a kiolvasás?
Azt írja az adatlap, hogy Temperature Conversion Time 100ms tipikusan, én most 100ms-onként olvasom ki. Ha 50ms-ra csökkentem akkor is csak 100ms-onként lesz új adat?
Ha jól emlékszem, ha túl gyakran olvasod ki, akkor nem tud mérni, és nem jó adatokat küld folyamatosan.
Próbáltam 50ms-onként is kiolvasni, nem volt gond. Maradok 100ms-nál, de jobban is megoldhatták volna. Úgy logikus hogy ha 100m-sonként mér és 25ms-onként olvasom akkor minden 4. kiolvasásnál kapok új értéket.
Idézet: „Úgy logikus hogy ha 100m-sonként mér és 25ms-onként olvasom akkor minden 4. kiolvasásnál kapok új értéket.”
Az adatlapbol csak az derul ki (szamomra), hogy a hatterben csinalja a merest, es hogy a CS high allapota alatt frissiti a kimeneti regisztert. Az nem derult ki az adatlapbol, hogy ciklikusan mér vagy mondjuk a CS low->high (vagy high->low) hatasara kezdi el a merest. Viszont az biztos, hogy ha egyszer 100ms-ig mer, akkor inkabb nem kellene piszkalni az SPI-n, mert attol csak maximum zajojsabb lesz a meres. Minek kiolvasni valamit belole, amirol tudod, hogy ugysem valtozik?
Ez így van, ezért is döntöttem a 100ms mellett.
Viszont érdekes anomáliába ütköztem. A méréstőlteljesen független.
/* portok inicializálása */
DDRD = (1<<PD0) | (1<<PD1) | (1<<PD3) | (1<<PD4) | (1<<PD5) | (1<<PD6) | (1<<PD7);
DDRC = 0xFF;
DDRB = (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB5) | (1<<PB7);
//felhúzó ellenállások
PORTB |= (1<<PB0) | (1<<PB6);
PORTD |= (1<<PD2);
//SlaveSelect magas szint -> inaktív
PORTB |= (1<<PB1);
/* mérés */
TCCR0 = (1<<CS01); //8-as prescaler, 1,024ms @ 2MHz
TIMSK |= (1<<TOIE0);
/* páka OCR1B PWM */
TCCR1A = (1<<COM1B1) | (1<<WGM11) | (1<<WGM12); //non-inverting mód, fast pwm 9 bit
TCCR1B = (1<<CS12); //256-os prescaler 30,51Hz @ 2MHz
OCR1B = 0;
/* Timer2 */
TCCR2 = (1<<CS21); //8-as előosztó, 976Hz @ 2MHz
TIMSK |= (1<<TOIE2); //engedélyezzük
/* INT0 engedélyezése */
MCUCR = (1<<ISC01) | (1<<ISC00);
GIMSK |= (1<<INT0); //INT0 engedélyezés
/* SPI beállítás */
SPCR = (1<<SPE) | (1<<MSTR); //SPI engedélyezés, master mód, fsck 500KHz @ 2MHz
wdt_enable(WDTO_60MS);
sei(); //megszakításokat engedélyezzük
A fenti inicializálás után, ha az OCR1B-nek bármilyen olyan értéket adok, ami nem 0, az AVR teljesen megzakkan. Olyan lábak kerülnek magas szintbe, amelyeket már beállítottam alacsony szintre. És a main-em is tök üres, csak a wdt reset van benne.
Sziasztok, van ötletetek miért nem fut le az interrupt függvény a következő kódban:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#define SCK 5 // SPI clock
#define SDO 4 // SPI Data output (RFM12B side)
#define SDI 3 // SPI Data input (RFM12B side)
#define CS 2 // SPI SS (chip select)
#define NIRQ 2 // (PORTD)
/* IO CONTROL */
#define HI(x) PORTB |= (1<<(x))
#define LO(x) PORTB &= ~(1<<(x))
#define WAIT_NIRQ_LOW() while(PIND&(1<<NIRQ))
/* LED */
#define LED 0
#define LED_OFF() PORTD &= ~(1<<LED)
#define LED_ON() PORTD |= (1<<LED)
#define BAUDRATE 25 // 19200 at 8MHz
void delay_ms(uint16_t ms)
{
while ( ms )
{
_delay_ms(1);
ms--;
}
}
void portInit() {
HI(CS);
HI(SDI);
LO(SCK);
DDRB = (1<<CS) | (1<<SDI) | (1<<SCK) | (1<<PB0) | (1<<PB1);
DDRD = (1<<LED) | (1<<PD7)| (1<<PD6) | (1<<PD5) | (1<<PD1); //set output pins
PORTB &= ~((1<<PB0) | (1<<PB1));
PORTD &= ~((1<<PD7) | (1<<PD6) | (1<<PD5));
}
unsigned int writeCmd(unsigned int cmd) {
unsigned char i;
unsigned int recv;
recv = 0;
LO(SCK);
LO(CS);
for(i=0; i<16; i++){
if(cmd&0x8000) HI(SDI); else LO(SDI);
HI(SCK);
recv<<=1;
if( PINB&(1<<SDO) ){
recv|=0x0001;
}
LO(SCK);
cmd<<=1;
}
HI(CS);
return recv;
}
void rfInit() {
writeCmd(0x80D7); //EL,EF,433band,12.0pF
writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC (bug was here)
writeCmd(0xA640); //freq select
writeCmd(0xC647); //4.8kbps
writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR (FIFO level = 8)
writeCmd(0xCED4); //SYNC=2DD4;
writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
writeCmd(0x9850); //!mp,90kHz,MAX OUT
writeCmd(0xCC17); //!OB1,!OB0, LPX,!ddy,DDIT,BW0
writeCmd(0xE000); //NOT USE
writeCmd(0xC800); //NOT USE
writeCmd(0xC040); //1.66MHz,2.2V
}
unsigned char rfRecv() {
unsigned int data;
while(1) {
data = writeCmd(0x0000);
if ( (data&0x8000) ) {
data = writeCmd(0xB000);
return (data&0x00FF);
}
}
}
void FIFOReset() {
writeCmd(0xCA81);
writeCmd(0xCA83);
}
int stepcount=0;
void fwd(){
PORTD |= (1<<PD6);
delay_ms(10);
PORTD &= ~(1<<PD6);
PORTB |= (1<<PB0);
delay_ms(10);
PORTB &= ~(1<<PB0);
PORTD |= (1<<PD7);
delay_ms(10);
PORTD &= ~(1<<PD7);
PORTD |= (1<<PD5);
delay_ms(10);
PORTD &= ~(1<<PD5);
}
void Turn(uint8_t dir)
{
if(dir==1 && stepcount<100)//left
{
if(stepcount % 4 == 0){
PORTD |= (1<<PD6);
delay_ms(10);
PORTD &= ~(1<<PD6);
}
if(stepcount % 4 == 1 || stepcount % 4 == -3){
PORTB |= (1<<PB0);
delay_ms(10);
PORTB &= ~(1<<PB0);
}
if(stepcount % 4 == 2 || stepcount % 4 == -2){
PORTD |= (1<<PD7);
delay_ms(10);
PORTD &= ~(1<<PD7);
}
if(stepcount % 4 == 3 || stepcount % 4 == -1){
PORTD |= (1<<PD5);
delay_ms(10);
PORTD &= ~(1<<PD5);
}
stepcount++;
}
if(dir==2 && stepcount > -100)//right
{
if(stepcount % 4 == 3 || stepcount % 4 == -1){
PORTD |= (1<<PD5);
delay_ms(10);
PORTD &= ~(1<<PD5);
}
if(stepcount % 4 == 2 || stepcount % 4 == -2){
PORTD |= (1<<PD7);
delay_ms(10);
PORTD &= ~(1<<PD7);
}
if(stepcount % 4 == 1 || stepcount % 4 == -3){
PORTB |= (1<<PB0);
delay_ms(10);
PORTB &= ~(1<<PB0);
}
if(stepcount % 4 == 0){
PORTD |= (1<<PD6);
delay_ms(10);
PORTD &= ~(1<<PD6);
}
stepcount--;
}
if(dir==0 && stepcount > 0)
{
if(stepcount % 4 == 3 || stepcount % 4 == -1){
PORTD |= (1<<PD5);
delay_ms(10);
PORTD &= ~(1<<PD5);
}
if(stepcount % 4 == 2 || stepcount % 4 == -2){
PORTD |= (1<<PD7);
delay_ms(10);
PORTD &= ~(1<<PD7);
}
if(stepcount % 4 == 1 || stepcount % 4 == -3){
PORTB |= (1<<PB0);
delay_ms(10);
PORTB &= ~(1<<PB0);
}
if(stepcount % 4 == 0){
PORTD |= (1<<PD6);
delay_ms(10);
PORTD &= ~(1<<PD6);
}
stepcount--;
}
if(dir==0 && stepcount < 0)
{
if(stepcount % 4 == 0){
PORTD |= (1<<PD6);
delay_ms(10);
PORTD &= ~(1<<PD6);
}
if(stepcount % 4 == 1 || stepcount % 4 == -3){
PORTB |= (1<<PB0);
delay_ms(10);
PORTB &= ~(1<<PB0);
}
if(stepcount % 4 == 2 || stepcount % 4 == -2){
PORTD |= (1<<PD7);
delay_ms(10);
PORTD &= ~(1<<PD7);
}
if(stepcount % 4 == 3 || stepcount % 4 == -1){
PORTD |= (1<<PD5);
delay_ms(10);
PORTD &= ~(1<<PD5);
}
stepcount++;
}
}
int receive_error=1;
uint8_t man_decode(uint16_t enc) {
int odd_byte,even_byte;
odd_byte=(int)(enc>>8);
if((odd_byte&0xAA)^((~odd_byte&0x55)<<1)) {
receive_error=1;
return(0);
} else odd_byte&=0xAA;
even_byte=(int)enc;
if((even_byte&0x55)^((~even_byte&0xAA)>>1)) {
receive_error=1;
return(0);
} else even_byte&=0x55;
receive_error=0;
return(odd_byte|even_byte);
}
void pwm_on_pb1()
{
DDRB |= (1 << DDB1); // PB1 is now an output
OCR1A = 0; //kitoltesi tenyezo
TCCR1A |= (1 << COM1A1); // set none-inverting mode
TCCR1A |= (1 << WGM12) | (0 << WGM11) | (1 << WGM10); // 8 bit fast pwm
TCCR1B |= (1 << CS10); // prescaler = 1
}
volatile uint8_t recv =0x00;
volatile uint8_t count=0;
int main(void) {
int i=0;
unsigned char data, step;
uint16_t encoded=0xFFFF;
uint8_t motspeed = 0x00, dir = 0x00;
step = 0x00;
LED_OFF();
portInit();
rfInit();
FIFOReset();
pwm_on_pb1();
//motor beallitasa
PORTD &= ~(1<<PD5);
PORTD &= ~(1<<PD7);
PORTB &= ~(1<<PB0);
PORTD &= ~(1<<PD6);
PORTD |= (1<<PD6);
delay_ms(10);
PORTD &= ~(1<<PD6);
PORTD |= (1<<PD6);
delay_ms(10);
PORTD &= ~(1<<PD6);
DDRD |= (1<<LED); //portinit
//set interrupt
TIMSK |= (1 << TOIE0);
sei(); //enable interrupts
TCCR0 |= (1 << CS02) | (1 << CS00);
while(1) {
recv = rfRecv(); //ha leállítom az adót itt megakad a kód mégsem fut le az interrupt???!!!
count=0; //reset count if data received
motspeed = recv & 0b00011111;//also 5 bit a sebesseg -> max 31 lehet
dir = recv >> 5; //felso 3 bit az irany
if(motspeed <= 31) //set motor speed
{
if((130/31 * motspeed) < 131)
{
OCR1A=130/31 * motspeed;
}
i++;
if(i==100){
LED_ON();
}
if(i==200){
LED_OFF();
i=0;
}
}
Turn(dir);
if(dir & 0b00000100){ //start motor2
PORTD |= (1<<PD1);
}else{ // stopmotor2
PORTD &= ~(1<<PD1);
}
FIFOReset();
}
return 0;
}
ISR (TIMER0_OVF_vect) // timer0 overflow interrupt
{
// event to be exicuted every 32ms here
count++;
if(count>=10)
{
OCR1A=0x00; //mot speed=0
recv=0x00;
count=0;
}
}
Ha csak ennyiből áll a kódmegy szépen:
// this code sets up a timer0 for 4ms @ 16Mhz clock cycle
// an interrupt is triggered each time the interval occurs.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define LED 6
#define LED_OFF() PORTD &= ~(1<<LED)
#define LED_ON() PORTD |= (1<<LED)
volatile uint8_t count=0;
int main(void)
{
DDRD |= (1<<LED); //portinit
TIMSK |= (1 << TOIE0);
sei(); //enable interrupts
TCCR0 |= (1 << CS02) | (1 << CS00);
while (1)
{
}
}
ISR (TIMER0_OVF_vect) // timer0 overflow interrupt
{
// event to be exicuted every 4ms here
count++;
if(count>=10)
{
LED_ON();
count=0;
}
}
Az interrupt része ugyan az, mégis miért nem megy az első kódban? Arra gyanakszom hogy a pwm_on_pb1() függvényben valamit elállítok....  Agyvérzés!
Megoldódott, rosszul volt beállítva a uc típusa az AVR studióban....
Mar regen nem AVR-eztem, inkabb nem okoskodom bele a timer-be. A PWM kimenet meghajt valamit? Arra gondolok, hogy lehet-e esetleg HW problema. Mondjuk zaj, amit a kapcsolt kimenet okoz.
Én is erre gyanakodtam. Egy FET-et kapcsol, amin 2A folyik át, soros ellenállással, ami 100r, a Gate-t pedig lehúzom a testhez egy 1K-s ellenállással. Ha csak simán a PD2-t kapcsolom ki/be akkor működik. De ha az 1ms-os timer-be rakom (PORTB ^=(1<<PB2)  , akkor szintén előjön a hiba.
Kizárásos alapon arra jutottam, hogy a relékkel 230voltot kapcsolók és az zavarja az SPI-t ha nincs 230v vagy leveszem a fogyasztót (kis teljesítményű motor) akkor tökéletesen megy. Ha rajta van meg zavarodik mindig akkor amikor kapcsolna ki vagy be.Esetleg valami ötlet? A nyákon amennyire lehetett nincs össze keverve a gyenge áram a 230-al. A logikai analizátorhoz milyen szoftver ajánlasz? Segítséget köszönöm.
Az SPI eléggé érzékeny zajokra. Próbáld meg minél rövidebben vezetni és egy földet is érdemes behúzni jelvezetékek mellé. Ha lehet akkor a tából is külön húzd a földet a logikai résznek és a reléhez. A relét pedig minnél távolabb rakd tőle.
Én így csinálnám, de ha valakinek ezen kívül vannak egyébb megoldásai is, azt én is szívesen meghallgatnám (elolvasnám).
Kedves barátim! Meglehetősen kezdő vagyok AVR-témában, ezért segítségeteket kérem; Hogyan lehet egy *.txt file-t átkonvertálni *.hex-be? BASCOM-t használok, és persze a txt-t nem lehet beletölteni... Mellékelem a HE oldalin megjelent 500 MHz-s frekimérő hex-ét, ami txt. Hogyan tovább???
Köszönettel; Tambi
Torold ki a vegerol a ".txt" kiterjesztest. A hozzászólás módosítva: Márc 9, 2015
Sziasztok!
Ezt szeretném megépíteni Tv-b-gone .
Csak valaki segít felprogramozni az avr chipet( ATtiny85v-10 ) ?
Itt van amit bele kéne égetni.(tvbgone.hex) A hozzászólás módosítva: Márc 9, 2015
Sziasztok!
Az égetőm tönkrement, mert a fuse bitet helytelenül használtam. Lehetséges, hogy az AVR, amit akkor vele programoztam az is tönkremehetett? Egy másik égetővel nem sikerül felprogramozni.
Szia, fuse bitek átírásával max az éppen programozott mikrokontrollert tudtad megölni, a programozót nem hinném. Amikor másik égetővel sem tudtad felprogramozni nem gontoltad, hogy mindkét égetőd jó csak a mikrokontrollerből zártad ki magad? Mondjuk beállítottál külső kristályt de nincs rajta, vagy kikapcsoltad a SPIEN bitet.
Van egy nem általam írt program atmega8 16PU val használt led 7szegmenses driver. Egyre nehezebb beszereznem, helyettesíthetem -e:
- ATMEGA8A-PU, ATMEGA8L-8PU, pl?
Akkor már értem miért nem lehet olvasni/írni. Igen, a SPIEN bit ki van kapcsolva, de hogy lehet visszakapcsolni?
Ugye ezzel kikapcsoltad az SPI-t amin keresztül programozni lehet. Nemrég tettem fel ide egy párhuzamos magas feszültségű programozót kapcsolással és kóddal (pár oldallal visszább), esetleg JTAG-gel ha van a kontrollereden és van programozód ami tudja, vagy elfelejted azt a mikrokontrollert.
Ez most elégé furcsa kijelentés!: ”Igen, a SPIEN bit ki van kapcsolva!”
Ezt hogyan tudtad megállapítani?
Mivel ha tényleg így van, akkor nem tudnád beolvasni a fusebíttek állapotát sem!
Hát igen, csak az a baj, hogy többe kerül megépíteni, mint új IC-t venni.
Persze akinek sok ideje van, összedughatja breadboardon.
|
|