Nếu đây là lần đầu tiên đến với Điện Tử Việt Nam, bạn có thể đọc phần Hỏi đáp bằng cách nhấn vào liên kết. Có thể bạn cần đăng kí trước khi có thể gửi bài . Để bắt đầu xem bài viết, chọn diễn đàn bạn muốn thăm dưới đây.
a[1]=200 Cái này khi dịch nó cấp phát biến a[1] ứng với 1 địa chỉ nào đó trong FLASH và gán bằng 200 giống như bạn khai const a = 200 vậy. Còn ghi vào flash là do chương trình programer của bạn làm chứ đâu phải là chương trình do bạn viết ra làm. Nghĩa là trong file HEX ( BIN, EXE ....) đã có sẵn giá trị 200 tại 1 vị trí ( địa chỉ ) ứng với biến a rồi. Cái này chỉ khác cách khai báo trong compiler . Như vậy MCU nào cũng OK. Kể cả loại OTM ( ROM ghi 1 lần)
Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.
Biến tần
Máy giặt
Lò vi sóng
Bếp từ.
Tủ lạnh.
Điều hòa
a[1]=200 Cái này khi dịch nó cấp phát biến a[1] ứng với 1 địa chỉ nào đó trong FLASH và gán bằng 200 giống như bạn khai const a = 200 vậy. Còn ghi vào flash là do chương trình programer của bạn làm chứ đâu phải là chương trình do bạn viết ra làm. Nghĩa là trong file HEX ( BIN, EXE ....) đã có sẵn giá trị 200 tại 1 vị trí ( địa chỉ ) ứng với biến a rồi. Cái này chỉ khác cách khai báo trong compiler . Như vậy MCU nào cũng OK. Kể cả loại OTM ( ROM ghi 1 lần)
Ko phải như anh nói đâu, có lẽ anh bị ảnh hưởng bởi PIC nên mới vậy. Một số trình dịch AVR nó làm được như trên.
Nếu khai báo:
const ... thì đương nhiên ko thay đổi giá trị được.
Nếu khai báo(ko nhớ cú pháp nhưng đại loại):
char a[10] flash;
Thì nó sẽ tự hiểu phần mềm sẽ thông minh ở đây. Nếu gán a[1]=200;thì nó sẽ làm một loạt thủ tục ghi vào flash. Địa chỉ bắt đầu của dữ liệu a[0] của flash phần mêm và trình dịch sẽ đủ thông minh xử lý việc đó(không khó). Nói đến vậy anh MinhHa đã hiểu và chấp nhận chưa nhỉ...hi hi...
Trên là nói về trịnhdich C của AVR.
Với PIC, nó không sử dụng bộ nhớ dữ liệu để lưu mà sử dụng ngay bộ nhớ chương trình. Có nghĩa là một mã lệnh 14 bit chẳng hạn, trong đó có 6 bit mã lệnh, còn lại 8 bit lưu luôn dữ liệu đó.
Đọc lại tutorial của F thì sẽ rõ.
Còn trường hợp mảng dữ liệu biến, thì nó cấp phát bộ nhớ dữ liệu để sử dụng. Điều này không liên quan gì đến Flash hay EEPROM cả.
char a[10] flash;
thì cũng vậy thôi, nó cầp phát biến này trong flash. Nếu cần thì gán ngay giá trị vào. còn khi ghi thì nó đâu có gọi hàm để ghi mà chỉ tạo ra file HEX. còn ghi vào flash là do programer làm chứ. Nếu khi đang chạy mà cần thay đổi thì phải có hàm để ghi chứ không gán lại a[10] = biến số được. Cái này chỉ có thể áp dụng lúc khai báo biến. Anh suy luận từ các laọi MCU khác sang không biết có OK không 3T?
Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.
Biến tần
Máy giặt
Lò vi sóng
Bếp từ.
Tủ lạnh.
Điều hòa
char a[10] flash;
thì cũng vậy thôi, nó cầp phát biến này trong flash. Nếu cần thì gán ngay giá trị vào. còn khi ghi thì nó đâu có gọi hàm để ghi mà chỉ tạo ra file HEX. còn ghi vào flash là do programer làm chứ. Nếu khi đang chạy mà cần thay đổi thì phải có hàm để ghi chứ không gán lại a[10] = biến số được. Cái này chỉ có thể áp dụng lúc khai báo biến. Anh suy luận từ các laọi MCU khác sang không biết có OK không 3T?
a[10]=200;//kiểu flash
Thì trình dịch sẽ tìm hiểu, à...mảng a[] nó là flash....à nó a[10] có địa chỉ là k+10(do k là địa chỉ a[0]),..à vậy trình dịch sẽ dịch cái đoạn mã ngắn ngủi a[10]=200 thành một đoạn code ghi vào flash địa chỉ k+10 với giá trị 200 vào. Công việc của trình biên dịch thì rất vất vả còn người lập trình chỉ đánh mỗi dòng a[10]=200 thôi. Nói tóm lại là trình dịch nhận hết sự khó khăn về phần mình
Thay vì viết:a[10]=200;
muốn hiểu bản chất hơn thì dùng hàm:
Write_Flash(unsigned int địa_chỉ,unsigned int giá_trị); thông dụng.
Write_Flash(k+10,200);
Chọn cái nào hơn???? hả anh MH
3T không hiểu ý anh rồi. Nếu khi chạy chương trình ví dụ char b flash;a = time; inc a, b = a; thì nó sẽ phải gọi hàm ghi flash. Nhưng khi viet a = 5 thì khi compiler nó đặt luôn 5 vào vị trí biến a luôn và programer sẽ ghi nó vào flash. Tại sao lại phải sinh ra hàm ghi làm gì nhỉ???
Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.
Biến tần
Máy giặt
Lò vi sóng
Bếp từ.
Tủ lạnh.
Điều hòa
Cái này với EEPOM của PIC cũng vậy.Nếu biết trước các giá trị cần ghi trong EEPROM ( data base ) anh tạo luôn ra file này và programer ghi luôn vào lúc nạp chương trình. Ví duk font cho LED MATRIX hay cho máy in kim chẳng hạn. Khi chương trình cần đến thì chỉ việc đọc ra dùng là OK. không cần hàm ghi. Nhưng khi cần thay đổi thì cần phải có hàm ghi EEPROM ( CCS cũng rất đơn giản Write_EEPROM....).
Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.
Biến tần
Máy giặt
Lò vi sóng
Bếp từ.
Tủ lạnh.
Điều hòa
Nhưng cách gán như vậy vô cùng trực quan, sáng sủa và dễ hiểu. Ko cần quan tâm tới địa chỉ lưu trữ, ko cần quan tâm tới hàm ghi... Nếu một trình dịch mà support mảng flash như trên, thì tại sao ko dùng mà phải đi vòng quanh?
Cách khai báo flash trên để nhằm mục đích lưu một số thông tin phòng khi mất điện. Ngoài ra, nó có thể coi là một lượng RAM khổng lồ đặc biệt(rất có lợi cho quảng báo chẳng hạn?), tất nhiên lượng RAM này ko đúng nghĩa RAM thật bởi: tốc độ thấp và hạn chế gán tùy tiện.
Cái này với EEPOM của PIC cũng vậy.Nếu biết trước các giá trị cần ghi trong EEPROM ( data base ) anh tạo luôn ra file này và programer ghi luôn vào lúc nạp chương trình. Ví duk font cho LED MATRIX hay cho máy in kim chẳng hạn. Khi chương trình cần đến thì chỉ việc đọc ra dùng là OK. không cần hàm ghi. Nhưng khi cần thay đổi thì cần phải có hàm ghi EEPROM ( CCS cũng rất đơn giản Write_EEPROM....).
Cái này thì em hiểu, nhưng một ví dụ:
Máy tính đẩy sang cho quảng báo một mảng dữ liệu, thì cách dùng mảng flash sẽ rất đơn giản. Chỉ việc gán là xong. Thậm chí ko tốn RAM để lưu giá trị.
- T3 có nhầm không thế? tôi đọc tất cả datasheet của AVR rồi, không con nào hỗ trợ ghi flash cả. Nó có chức năng ISP nhưng chỉ dùng để nạp chương tình thôi, không tự ghi vào được khi nó đang chạy.
Thay vì viết:a[10]=200;
muốn hiểu bản chất hơn thì dùng hàm:
Write_Flash(unsigned int địa_chỉ,unsigned int giá_trị); thông dụng.
Write_Flash(k+10,200);
Chọn cái nào hơn???? hả anh MH
- Không biết T3 đang nói về con nào vậy AVR/PIC? . Nếu là PIC thì đúng.
- Còn AVR thì không được. Khai báo biến dạng flash thì rất vô tư, thoải mái kích thước, kiểu dữ liệu ... Nhưng không thể ghi vào được, ( bản chất AVR đã không hỗ trợ rồi ) - nếu dùng CodeVisionAVR thì khi gán một biến kiểu flash sẽ hiện báo lỗi "unmodifiable Ivalue". T3 thử kiểm tra lại xem.
- T3 có nhầm không thế? tôi đọc tất cả datasheet của AVR rồi, không con nào hỗ trợ ghi flash cả. Nó có chức năng ISP nhưng chỉ dùng để nạp chương tình thôi, không tự ghi vào được khi nó đang chạy.
- Không biết T3 đang nói về con nào vậy AVR/PIC? . Nếu là PIC thì đúng.
- Còn AVR thì không được. Khai báo biến dạng flash thì rất vô tư, thoải mái kích thước, kiểu dữ liệu ... Nhưng không thể ghi vào được, ( bản chất AVR đã không hỗ trợ rồi ) - nếu dùng CodeVisionAVR thì khi gán một biến kiểu flash sẽ hiện báo lỗi "unmodifiable Ivalue". T3 thử kiểm tra lại xem.
Nói đến vậy mà bạn vẫn chưa tin à? không phải tất cả nhưng có lẽ hầu hết các con AVR đều hỗ trợ. Tất cả các con AVR support "self programming "đều được hết. ISP và Bootloader là khác nhau đó.
Có một cái link nhỏ để bạn tham khảo ngay trên diễn đàn này. http://dientuvietnam.net/board/showthread.php?t=425
Một vài link trên diễn đàn này cũng có nói, bạn tìm lại thử xem.
Hẹn ra năm mình trả lời tiếp, cho mình thời gian đón tết với chứ...hihi...
đúng như laguna nói, eeprom mới gán được eeprom char a[x]=b. Flash (để lưu code) kô gán được trong khi đang chạy. Bác nào đọc kỹ cob MB89F202 cho hỏi flash của nó có tự ghi trong khi chạy được kô. Nó có nói để ghi được vào flash khi đang chạy cần tự động load code vào RAM. Thế là thế nào. PIC có làm thế không. Mình đọc SAM7 thấy nó có bootloader sẽ chiếm một ít RAM để ghi flash.
đúng như laguna nói, eeprom mới gán được eeprom char a[x]=b. Flash (để lưu code) kô gán được trong khi đang chạy. Bác nào đọc kỹ cob MB89F202 cho hỏi flash của nó có tự ghi trong khi chạy được kô. Nó có nói để ghi được vào flash khi đang chạy cần tự động load code vào RAM. Thế là thế nào. PIC có làm thế không. Mình đọc SAM7 thấy nó có bootloader sẽ chiếm một ít RAM để ghi flash.
Hi hi... vẫn chưa tin!!! thế mới lạ.
PIC em dùng cách ghi vào flash thay eeprom thường xuyên.Bootloader cũng là một cách đó.
Mình cần đặt hàng thiết kế chế tạo mạch nghịch lưu 3 pha để cài đặt các thuật toán điều khiển động cơ FOC, DTC, ... Xin liên hệ trungaut@gmail.com để bàn chi tiết. Xin cảm ơn diễn dàn đăng tin!
Trừ trường hợp công suất (rất) thấp, hầu như tất cả các loại nguồn xung thông thường đều có tụ nhỏ 1 - 10nF nối giữa sơ cấp và thứ cấp, để thoát nhiễu và để chống hiện tượng tương tự tĩnh điện. Vụ này đã thảo luận vài...
Dạ chú sắm con át chống giật và thay nguồn tổ ong khác cho an toàn ạ. Đa phần nguồn xung đều xả nhiễu của bên thứ cấp về điện lưới qua 1 con tụ nên cảm giác tê sẽ khó xác định rõ ràng là do rò điện hay là nó vốn vậy...
Comment