Mayday! AVR problem!
Postat: 22 mars 2012, 17:54:10
Nu är det problem! Har fått harva i ett gammalt projekt som visade sig vara "intressant".
Win7, 32 bit
AVR Studio 4.18, build 684.
GCC toolchain
ATmega88
AVRISP mkII
10MHz kristall
Fuses: SPI enabled, Ext. crystal, full swing. Ingen andra fuse-funktioner är aktiverade.
Vad ska enheten göra?
Den ska läsa lite data från UART och presentera dom på 3 st 7-segment LED.
Status:
Timer-interrupt fungerar!
Har inte kommit till UART'en än.
I min enfald antog jag att det var ganska enkelt, det fanns en mjukvara som borde ha fungerat sedan tidigare men pga. att folk har avslutat sin anställning osv. är all versionskontroll och kommentarer otroligt dimmiga. Hela enheten är byggt efter ett foto, inget schema finns. Alltså ska jag mer eller mindre uppfinna hjulet igen...
Hårdvaran var bristfällig, det är experimentkort, VDD var inte dragit ut till ICSP-kontakten och inte heller till AVCC men det har jag avklarat.
Avkopplingen var synnerligt bristfälligt också, även det har jag avklarat.
Scanningen fungerar skapligt men det är något knasigt i hela setup'en eller något.
Koden kompileras utan fel eller varningar, en HEX-fil skapas och jag kan bränna in den utan problem och den gör det jag ber den om - nästan! Och det är "nästan" som håller på att driva mig till vansinne...
Såklart initieras de olika enheter och den delen har jag inte pillat på.
Frågor som finns:
1: Ska man göra på något speciellt sätt i projektet när man bygger det? Alltså minnesinställningar, stack osv?
2: Ska man läsa på ett annat sätt när man vill indexera RAM? Alltså om jag vill läsa PORTC = Digits[Digit_Ctr]; ???
3: Ska RESET/MCLR ha en pull-up eller räcker det med den interna? Då jag startade den utan att AVRISP'en var på verkade den död.
4: Jag har inte hunnit lusläsa databladet men rakt av: finns det speciella saker man ska komma ihåg när man använder PORTB och PORTC?
Åh, vad det grämer mig att de inte har använd det mönsterkort som jag ritade till detta i sin tid - men det dög inte, det satt en PIC på! Det skulle vara AVR och en systemvetare till att programmera. *suck*
Win7, 32 bit
AVR Studio 4.18, build 684.
GCC toolchain
ATmega88
AVRISP mkII
10MHz kristall
Fuses: SPI enabled, Ext. crystal, full swing. Ingen andra fuse-funktioner är aktiverade.
Vad ska enheten göra?
Den ska läsa lite data från UART och presentera dom på 3 st 7-segment LED.
Status:
Timer-interrupt fungerar!
Har inte kommit till UART'en än.
I min enfald antog jag att det var ganska enkelt, det fanns en mjukvara som borde ha fungerat sedan tidigare men pga. att folk har avslutat sin anställning osv. är all versionskontroll och kommentarer otroligt dimmiga. Hela enheten är byggt efter ett foto, inget schema finns. Alltså ska jag mer eller mindre uppfinna hjulet igen...
Hårdvaran var bristfällig, det är experimentkort, VDD var inte dragit ut till ICSP-kontakten och inte heller till AVCC men det har jag avklarat.
Avkopplingen var synnerligt bristfälligt också, även det har jag avklarat.
Scanningen fungerar skapligt men det är något knasigt i hela setup'en eller något.
Koden kompileras utan fel eller varningar, en HEX-fil skapas och jag kan bränna in den utan problem och den gör det jag ber den om - nästan! Och det är "nästan" som håller på att driva mig till vansinne...
Kod: Markera allt
volatile uint8_t Digits[3]; // The 3 digits scanning buffer. Contains bitpattern för applicable digit
uint8_t Digit_Pattern[10] PROGMEM = { ... 10 bytes med bitmönster för siffrorna '0' - '9'...};
uint8_t Digit_Sel[3] PROGMEM = {0b00000001, 0b00000010, 0b00000100};
uint8_t Digit_Ctr;
SIGNAL (SIG_OUTPUT_COMPARE1A)
{
// Turn off all LED digits and rows first to avoid ghosting
PORTB = PINB & PORTB_BLANK;
PORTC = PINC & PORTC_BLANK;
if(++Digit_Ctr > Digit_2) Digit_Ctr = Digit_0; // Count the digits scanning, something must take time to avoid ghosting so why not this?
// Turn on segments
PORTB = (PINB & PORTB_BLANK) | (PORTB_DIGIT_BITS & Digits[Digit_Ctr]);
PORTC = (PINC & PORTC_BLANK) | (PORTC_DIGIT_BITS & Digits[Digit_Ctr]);
// Turn on digit-select
PORTB = PINB | pgm_read_byte(&(Digit_Sel[Digit_Ctr]));
}
Frågor som finns:
1: Ska man göra på något speciellt sätt i projektet när man bygger det? Alltså minnesinställningar, stack osv?
2: Ska man läsa på ett annat sätt när man vill indexera RAM? Alltså om jag vill läsa PORTC = Digits[Digit_Ctr]; ???
3: Ska RESET/MCLR ha en pull-up eller räcker det med den interna? Då jag startade den utan att AVRISP'en var på verkade den död.
4: Jag har inte hunnit lusläsa databladet men rakt av: finns det speciella saker man ska komma ihåg när man använder PORTB och PORTC?
Åh, vad det grämer mig att de inte har använd det mönsterkort som jag ritade till detta i sin tid - men det dög inte, det satt en PIC på! Det skulle vara AVR och en systemvetare till att programmera. *suck*