C ++ „nebyl deklarován v tomto rozsahu“ Chyba kompilace a úpravy tipy

hlasů
1

Snažím se změnit tento kód ve snaze, aby to fungovalo na Arduino Mega. Jsem skoro nový C tak, abych udělal nějaké velké chyby. Mimochodem, je to pro sebe vyvažovací skateboardu. : P

Tento kód je převzata z ATmega32 (od: [url = http://sites.google.com/site/onewheeledselfbalancing/Home/twin-wheel-self-balancing-skateboard-lightweight-version/code4]http://sites .google.com / site / onewheeledsel ... t-version / code4 [/ url] a já se snažím, aby to fungovalo na Arduino Mega.

Tento kód byl napsán pro ATmega32 Developpement palubě http://www.active-robots.com/products/controllr/m32db.shtml

Děkuji!

Zde je první chyba I setkat:

Ve funkci 'void timer_init ()': Chyba: 'TCCR0' nebyl prohlášen v této oblasti působnosti ve funkci 'int main ()':

Mohl by mi někdo vysvětlit mi, co je špatně? Jsem docela hodně začátečník v programování, ale já jsem přečetl spoustu knih / webové stránky a učím se příliš rychle! ^^ a tady je kompletní kód (jeho poměrně dlouhá):

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <math.h>

vymezují CLOCK_SPEED 16000000

vymezují OCR1_MAX 1023

typedef unsigned char U8; void set_motor_idle (void); void InitPorts (void); plovákový = 0; float Throttle_pedal; float AA; float accelraw; float x_acc; float accsum; float x_accdeg;

float gyrosum;

float gangleratedeg; float gangleraterads; float Ti = 2.2;

float overallgain; float gaincontrol; float batteryvolts = 24; float gyroangledt; float úhel; float anglerads; float balance_torque; float SoftStart;

float cur_speed; float cycle_time = 0,0064; float Balance_point; float A0, A1, A2, A3, A4, A5, A6; // Savitzky-Golay proměnné pro akcelerometru

int i; int j; int TipStart; void InitPorts (void) {PORTC = 0x00; // Port C pullups nastaven na nízkou (bez výstupního napětí) začít DDRC = 0xFF; // Port C kolíky vše nastaveno jako výstup přes směru portu C registrovat // PORTC | = (1 <

DDRA = 0x00; // všechny portu A vývody nastaveny jako vstupní PORTA = 0x00; // Port vstupního pullups nastavena na hodnotu Nízká pullups

DDRD = 0xFF; // Konfigurace všech portů D kolíky jako výstup jako předpoklad pro OCR1A (PinD5) a OCR1B PIN (D4) pracuje správně

PORTB = 0x00; // Port B pullups nastaven na nízkou (bez výstupního napětí), začít s DDRB = 0xFF; // Všechny piny portu B nastaven na výstup

} / * IO: Používám ATmega32 16 MHz s vnějším krystalu hodiny. Nové plánované kolíků na OSMC regulátoru motoru PC4 LED na desce PD5 / OC1A ALI -> OSMC kolík 6 PD4 / OC1B BLI -> OSMC kolík 8 PC1 Zakázat -> OSMC kolík 4 PC2 BHI -> OSMC kolík 7 PC3 AHI -> OSMC kolík 5 PA6 / ADC6 Vbatt / 10 -> OSMC pin 3 PA1 / ADC1 rozteč rychlost gyroskop PA0 / ADC0 akcelerometr / void adc_init (void) {/ vypnutí analogového komparátoru, tak jak se to použít / ACSR = (1 << ACD); / Select PA0 / ADMUX = 0; ADMUX | = (1 <Set ADC prescaler až 128 povolit ADC, a začne konverze / ADCSRA = 0 | (1 </ počkat, až falešné první konverze dokončena * / while (ADCSRA & (1 << ADSC)) {}}

uint16_t adc_read (uint8_t kanál) {
/ * Výběr kanálu / ADMUX = kanálu; ADMUX | = (1 <spuštění konverze /
ADCSRA | = (1 << ADSC); /
počkat, až konverze dokončena /, zatímco (ADCSRA & (1 << ADSC)) {} / vrátí výsledek * / return ADCW;}

/ * 156 cyklů za sekundu, 6.4ms jednom cyklu měří na osciloskop * / / * přečíst všechny ADC vstupy a udělat nějaké konverze * / void sample_inputs (void) {

uint16_t adc0, adc1, adc2, adc3, adc4, adc5;
 gyrosum=0;   adc0 = adc_read(0); /* accelerometer pin PA0 */   accelraw

= (Float) adc0; pro (j = 0; j <7; j ++) {ADC1 = adc_read (1); // gyroskop pin PA1 gyrosum = (float) gyrosum + ADC1; // pomocí v průměru 7 vzorků na smyčce gyroskopu, takže se dostane kompletní aktualizace se každé smyčky programu}

adc2 = adc_read(2); /* grey wire overallgain (via cutout switch)

pozice PA2 * / adc3 = adc_read (3); / * Pozice páky zdvihne pozice PO 3 * / adc4 = adc_read (4); / * Throttle_pedal pozice PA4 * / ADC5 = adc_read (5); / * Pozice páky tlačen dopředu pozice PA5 * / // adc6 = adc_read (6); / * Vbatt vstup z OSMC (není použit v současné době) polohy PA6 * / // Sav Golay filtr pro zrychlení pouze A0 = A1; A1 = A2; a2 = a3; a3 = a4; A4 = A5; a5 = A6; a6 = (float) accelraw; accsum = (float) ((-2 * a0) + (3 x A1) + (6 * a2) + (7 * a3) + (6 * a4) + (3 * a5) + (-2 * a6)) / 21; // výpočet Sav Golay

    gaincontrol = (float) gaincontrol*0.9 + 0.1*adc2/341;

// vyhlazuje žádné napěťové špičky a poskytuje řadu 0-3 Throttle_pedal = (float) Throttle_pedal * 0,9 + 0,1 * adc4 / 341; // vyhlazuje žádné napěťové špičky a poskytuje řadu 0-3

// odpojí motor v případě, že mrtvý tlačítko mans se pustit // (gaincontrol proměnná také zapojeny přes toto tlačítko ADC2, pokud (ADC2 <100) {Throttle_pedal = 0,001; gaincontrol = 0,001;} overallgain = gaincontrol * softstart; // co dělat, když se páka posune vzad nebo tlačil dopředu a nic nedělat: Balance_point = 514; if (adc3> 100) Balance_point = 534;

if (ADC5> 100) Balance_point = 494;

 PORTB |= (1<<PB2);//Port B2 turned on/off once per loop so I can

měřit čas smyčky s osciloskopem

/ Zpracování ACCELEROMETER signál / / Odečíst posuny / x_acc = (float) accsum - Balance_point; // accsum je hodnota SG pro akcelerometr, není pravda, „součet“, takže není třeba dělit o 7, pokud (x_acc <-250) x_acc = -250; // víčko Accel hodnot do rozmezí od -250 do 250 (80 stupně naklonit v každém směru), pokud (x_acc> 250) x_acc = 250; / * Změna úhlu Akcelerometr je o 3,45 jednotek na studia naklonění v rozsahu 0-30 ° (sin theta) Convert sklonu na stupně náklonu od senzoru akcelerometru. Úhel sin zhruba = úhel pro malé úhly takže není třeba dělat trigonometrie. x_acc níže je nyní ve stupních * /

x_accdeg = (float) x_acc / -3,45; // Znaménko minus koriguje za zády k upevnění předního akcelerometr!

  /*GYRO signal processing*/
 /*Subtract offsets: Sensor reading is 0-1024 so balance point

tedy můj zapotřebí nulový bod bude, že čtení minus 512 * /

/ Gyro změna úhlu 20mV za deg za sekundu z listu dává změnu 4,096 jednotek (na stupnici od 0 - 1023) na stupně na úhlu sec změnit To omezuje rychlost změny gyroskopického úhlu jen menší, než je maximální rychlost, že je ve skutečnosti schopné měřit (100deg / sec). Poznámka: Všechny tyto frakce se zaokrouhlují na celé číslo později těsně před tím, než je odeslán do PWM generátoru, který sám je připojen k regulátoru motoru / gangleratedeg = (float) ((gyrosum / 7) - 508) /4.096; // gyrosum je součet skupiny 7 vzorků, tak dělení 7 pro gyro hodnotu, pokud (gangleratedeg <-92) gangleratedeg = -92; if (gangleratedeg

92) gangleratedeg = 92 / Obracím portu B2 zapnutí a vypnutí jednou za hlavního programového cyklu, takže mohu připojit osciloskop k němu a přijít na čas programu cyklu používám čas cyklu přijít změna úhlu gyroskop na cyklus, kde musíte znát délku tohoto časového intervalu / PORTB & = (0 <

/ Ti představuje měřítko pro „i“ nebo integrální faktoru (v současné době 2,2 zde) gyroangledt je anglechange od posledního cyklu ve stupních od gyroskopickým snímačem, kde Ti je faktor měřítka (by teoreticky být asi 1, ale 2,2 provedení deska pocit těsnější)
ganglerate je nyní v jednotkách stupňů za sekundu aa mění časovou konstantu, tedy menší hodnota aa je akcelerometr časovou konstantu delší, protože pomalu koriguje na gyro drift
/

aa = 0,005; gyroangledt = (float) Ti cycle_time gangleratedeg;
gangleraterads = (float) gangleratedeg * 0,017453;

/ Nový úhel ve stupních je starý úhel a změnou úhlu z gyroskopu od posledního cyklu s trochou nového rozběh čtení omezené v / úhel = (float) ((1-AA) * (úhel + gyroangledt)) + (AA * x_accdeg ); // hlavní úhel výpočtu funkce * / // Převod úhlu ze stupňů na radiány

 anglerads=(float)angle*0.017453;
      balance_torque=(float)(4.5*anglerads)

+ (0,5 * gangleraterads);

cur_speed = (float) (cur_speed + (Throttle_pedal * balance_torque * cycle_time)) * 0,999;

/ * Hodnota množství od -1 až +1 a představuje pracovní cyklus, které mají být zaslány do motoru. Převod na radiány nám pomáhá zůstat v těchto mezích level = (balance_torque + cur_speed) * overallgain;

}

void timer_init () {TCCR0 = 0 | (1 <

// režim PWM je PWM, Phase Correct, 10-bit TCCR1A = 0 | (1 <

(1 <

void set_motor ()

/ * V leveli termíny termín je úroveň rescaled od -1023 do +1023 jako celé číslo připravena k odeslání do řídicí vstupy PWM motoru, které jsou zase připojené k OSMC * / {

// pokud <úroveň (-0,9 = -0,9; // kontroly Jsme v rozumných mezích, pokud // (Hladina)> 0,9) Stupeň = 0,9;

int16_t leveli = (int16_t) (stupeň * 1023); // POZNÁMKA zde bereme hodnotu s plovoucí desetinnou čárkou jsme skončili na „úrovni“, vynásobíme ji 1023 a pak se to na celé číslo před krmením hodnotu do generátoru PWM jako „leveli“

if (leveli <-1020) leveli = -1020; // dvojité kontroly Jsme v rozumných mezích PWM je nechtějí být náhle shozen desku if (leveli> 1020) leveli = 1020;

/ Nastavení LED nebo bzučáku na Port B1, aby mě varoval zpomalit, pokud točivý moment má být dodáno více než 50% maximální možný důvod pro toto je, že budete vždy potřebovat nějakou sílu rezervy motoru v případě, že jste začít překlopení dopředu rychlostí If Motor již běží naplno byste asi na podzim přes vysokou rychlostí! Někteří používají auto-tip zpět rutina automaticky omezí maximální rychlost. Pro tuto chvíli udělám to takhle jako jednodušší /

if (úroveň <-0,7 || úroveň> 0,7) {
PORTB | = (1 <PORTB & = (0 <

softstart = (float) softstart + 0,001; if (softstart> 1,0) softstart = 1,0;

//PORTC |= (0<<PC1);   // AHI=1  PinC3, BHI=1 PinC2 set both to ON for

OSMC pracovat a jak do polohy OFF k vypnutí motoru dolů / * Poznámka: Nejste si jisti, proč, ale k zastavení motoru vyřezávání na změny směru jsem měl v závěru na tvrdý drát AHI a BHI na + 12V / / Un-zakázány OSMC nastavením PinC1 výstup na nulu, 1 by zakázat OSMC * / PORTC | = 0x0C; // aby C1 stržen tak un-zakáže OSMC tedy to umožňuje. PORTC & = ~ 0x02; // deaktivace, kdyby (leveli <0) {OCR1A = -leveli; // ALI je PWM jít dozadu, jak leveli proměnné je záporná hodnota podepsán, mějte na znaménko mínus tady! OCR1B = 0; // BLI = 0} jinak {OCR1A = 0; // ALI = 0 se dopředu jako leveli proměnná je kladná hodnota podepsaný OCR1B = leveli; // BLI je PWM}}

int main (void) {InitPorts ();

adc_init ();

timer_init ();

/ * Počáteční tilt-start kód Zapněte mikro zatímco deska naklonil k jedné straně, jezdec chystá vstoupit na tom, je-li úhel náklonu překročí nulu (mid) bod Vyvážení algoritmus začne fungovat v této smyčky jinak zamčené navždy, dokud se vyklápí do vodorovné polohy jako jezdec dostane na palubě * / TipStart = 0; accelraw = 0;

zatímco (TipStart <1) {

// budete potřebovat, aby se filtr SG větru až do správné stabilní hodnotu při prvním spuštění stroje po okamžik, kdy při pohledu na hodnotu accsum (viz níže).

pro (i = 0; i <20; i ++) {
sample_inputs ();
}

if (accsum <504 || accsum> 524) {//
pokud (x_accdeg> 0) {TipStart = 0; } Else {TipStart = 1;
softstart = 0,4; }}

úhel = 0; cur_speed = 0; / * End of tilt startovacího kódu. Pokud jdou nad rámec tohoto bodu poté stroj stal úrovni a je aktivní * /

SEI ();

přičemž (1) {sample_inputs ();

set_motor ();

}}

Položena 29/12/2009 v 02:28
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
2

Myslím, že jste možná přestali uzavírací komentář:

/*The level value is from -1 to +1 and represents the duty cycle to be sent to the motor. Converting to radians helps us stay within these limits >>>*/<<<
Odpovězeno 29/12/2009 v 02:40
zdroj uživatelem

hlasů
4

Ty s největší pravděpodobností špatně MCU určený pro sestavení. Zatímco DDRA existuje na ATmega1280 na Arduino Mega, DDRA neexistuje na ATMEGA328 pravidelného Arduino.

Pokud používáte Arduino UI, jděte na Nástroje | Board a vyberte Arduino Mega.

Pokud používáte svůj vlastní sestavení systému, budete muset aktualizovat hodnotu, kterou jste určili pro -mmcu = na gcc příkazového řádku.

Odpovězeno 29/12/2009 v 03:37
zdroj uživatelem

hlasů
0

Když vám kompilátor říká, že něco „nebyla přiznána v tomto rozsahu“, jak sami sebe tuto otázku:

Jakém rozsahu byla vyslovena?

Nemůžete-li odpovědět na tuto otázku, pak jste objevili problém. Koneckonců, pokud jste nevíte, co tento název odkazuje, jak můžete očekávat, že překladač na? Nezapomeňte, že jste jsou odborník na jakýkoli kód budete psát.

Pokud si můžete určit, jaký rozsah věc je udávána v, pak je dalším úkolem je zjistit, jak to prostor se vztahuje k rozsahu, který se snažíte použít v typické problémy zahrnují (ale nejsou omezeny na) následující.:

  • To byla prohlášena v nějakém jiném oboru názvů. Použijte ::operátor rozsah rozlišením dát úplný název.
  • To byla prohlášena za člena třídy a snažíte se ji používat v samostatném funkci. Buď najít instanci třídy a přístup k proměnné nebo funkce pomocí tohoto objektu, nebo změnit třídu, aby své nové funkci jako jeden z jejích členů.

Pokud si nemůžete najít to, co rozsah byl vyhlášen v, pak je zde několik věcí, které by mohly být v pořádku:

  • Vy jste napsána špatně. Kontrola pravopisu v dokumentaci a opravit svůj kód.
  • Je vyhlášena v nějakém záhlaví, které jste zapomněli zahrnout. Zjistit, kde je deklarována a přidat příslušné #includesměrnice. Jedná se pravděpodobně o problém ve vašem případě.
  • To není deklarován kdekoli. Zjistit, kde to mělo být deklarována a prohlásit ho tam sám.
Odpovězeno 29/12/2009 v 05:23
zdroj uživatelem

hlasů
-1

Zde je odkaz na poměrně jednoduché Arduino kódu pro kontrolu DIY Segway.

To by byl lepším východiskem pro skateboardu myslím.

http://diysegway.blogspot.com/

Všechno nejlepší

John

Odpovězeno 06/02/2010 v 19:28
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more